should be accounted for in the PROC_SEM_MAP_ENTRIES() macro. Otherwise
the ports that rely on this macro to size data structures are broken.
Mea culpa.
/*
* Compute size for ProcGlobal structure. Note we need one more sema
- * besides those used for regular backends.
+ * besides those used for regular backends; this is accounted for in
+ * the PROC_SEM_MAP_ENTRIES macro. (We do it that way so that other
+ * modules that use PROC_SEM_MAP_ENTRIES(maxBackends) to size data
+ * structures don't have to know about this explicitly.)
*/
Assert(maxBackends > 0);
- semMapEntries = PROC_SEM_MAP_ENTRIES(maxBackends + 1);
+ semMapEntries = PROC_SEM_MAP_ENTRIES(maxBackends);
procGlobalSize = sizeof(PROC_HDR) + (semMapEntries - 1) *sizeof(SEM_MAP_ENTRY);
/* Create or attach to the ProcGlobal shared structure */
* in each set for identification purposes.)
*
* PROC_SEM_MAP_ENTRIES is the number of semaphore sets we need to allocate
- * to keep track of up to maxBackends backends.
+ * to keep track of up to maxBackends backends. Note that we need one extra
+ * semaphore (see storage/lmgr/proc.c), so the computation may look wrong,
+ * but it's right.
*/
#define PROC_NSEMS_PER_SET 16
-#define PROC_SEM_MAP_ENTRIES(maxBackends) (((maxBackends)-1)/PROC_NSEMS_PER_SET+1)
+#define PROC_SEM_MAP_ENTRIES(maxBackends) ((maxBackends)/PROC_NSEMS_PER_SET+1)
typedef struct
{