@@ -91,26 +91,35 @@ static void CheckDeadLock(void);
91
91
92
92
93
93
/*
94
- * Report shared-memory space needed by InitProcGlobal .
94
+ * Report shared-memory space needed by PGPROC .
95
95
*/
96
- Size
97
- ProcGlobalShmemSize (void )
96
+ static Size
97
+ PGProcShmemSize (void )
98
98
{
99
99
Size size = 0 ;
100
100
Size TotalProcs =
101
101
add_size (MaxBackends , add_size (NUM_AUXILIARY_PROCS , max_prepared_xacts ));
102
- Size fpLockBitsSize ,
103
- fpRelIdSize ;
104
102
105
- /* ProcGlobal */
106
- size = add_size (size , sizeof (PROC_HDR ));
107
103
size = add_size (size , mul_size (TotalProcs , sizeof (PGPROC )));
108
- size = add_size (size , sizeof (slock_t ));
109
-
110
104
size = add_size (size , mul_size (TotalProcs , sizeof (* ProcGlobal -> xids )));
111
105
size = add_size (size , mul_size (TotalProcs , sizeof (* ProcGlobal -> subxidStates )));
112
106
size = add_size (size , mul_size (TotalProcs , sizeof (* ProcGlobal -> statusFlags )));
113
107
108
+ return size ;
109
+ }
110
+
111
+ /*
112
+ * Report shared-memory space needed by Fast-Path locks.
113
+ */
114
+ static Size
115
+ FastPathLockShmemSize (void )
116
+ {
117
+ Size size = 0 ;
118
+ Size TotalProcs =
119
+ add_size (MaxBackends , add_size (NUM_AUXILIARY_PROCS , max_prepared_xacts ));
120
+ Size fpLockBitsSize ,
121
+ fpRelIdSize ;
122
+
114
123
/*
115
124
* Memory needed for PGPROC fast-path lock arrays. Make sure the sizes are
116
125
* nicely aligned in each backend.
@@ -123,6 +132,24 @@ ProcGlobalShmemSize(void)
123
132
return size ;
124
133
}
125
134
135
+ /*
136
+ * Report shared-memory space needed by InitProcGlobal.
137
+ */
138
+ Size
139
+ ProcGlobalShmemSize (void )
140
+ {
141
+ Size size = 0 ;
142
+
143
+ /* ProcGlobal */
144
+ size = add_size (size , sizeof (PROC_HDR ));
145
+ size = add_size (size , sizeof (slock_t ));
146
+
147
+ size = add_size (size , PGProcShmemSize ());
148
+ size = add_size (size , FastPathLockShmemSize ());
149
+
150
+ return size ;
151
+ }
152
+
126
153
/*
127
154
* Report number of semaphores needed by InitProcGlobal.
128
155
*/
@@ -175,6 +202,8 @@ InitProcGlobal(void)
175
202
* fpEndPtr PG_USED_FOR_ASSERTS_ONLY ;
176
203
Size fpLockBitsSize ,
177
204
fpRelIdSize ;
205
+ Size requestSize ;
206
+ char * ptr ;
178
207
179
208
/* Create the ProcGlobal shared structure */
180
209
ProcGlobal = (PROC_HDR * )
@@ -204,8 +233,17 @@ InitProcGlobal(void)
204
233
* with a single freelist.) Each PGPROC structure is dedicated to exactly
205
234
* one of these purposes, and they do not move between groups.
206
235
*/
207
- procs = (PGPROC * ) ShmemAlloc (TotalProcs * sizeof (PGPROC ));
208
- MemSet (procs , 0 , TotalProcs * sizeof (PGPROC ));
236
+ requestSize = PGProcShmemSize ();
237
+
238
+ ptr = ShmemInitStruct ("PGPROC structures" ,
239
+ requestSize ,
240
+ & found );
241
+
242
+ MemSet (ptr , 0 , requestSize );
243
+
244
+ procs = (PGPROC * ) ptr ;
245
+ ptr = (char * ) ptr + TotalProcs * sizeof (PGPROC );
246
+
209
247
ProcGlobal -> allProcs = procs ;
210
248
/* XXX allProcCount isn't really all of them; it excludes prepared xacts */
211
249
ProcGlobal -> allProcCount = MaxBackends + NUM_AUXILIARY_PROCS ;
@@ -217,13 +255,17 @@ InitProcGlobal(void)
217
255
* XXX: It might make sense to increase padding for these arrays, given
218
256
* how hotly they are accessed.
219
257
*/
220
- ProcGlobal -> xids =
221
- (TransactionId * ) ShmemAlloc (TotalProcs * sizeof (* ProcGlobal -> xids ));
222
- MemSet (ProcGlobal -> xids , 0 , TotalProcs * sizeof (* ProcGlobal -> xids ));
223
- ProcGlobal -> subxidStates = (XidCacheStatus * ) ShmemAlloc (TotalProcs * sizeof (* ProcGlobal -> subxidStates ));
224
- MemSet (ProcGlobal -> subxidStates , 0 , TotalProcs * sizeof (* ProcGlobal -> subxidStates ));
225
- ProcGlobal -> statusFlags = (uint8 * ) ShmemAlloc (TotalProcs * sizeof (* ProcGlobal -> statusFlags ));
226
- MemSet (ProcGlobal -> statusFlags , 0 , TotalProcs * sizeof (* ProcGlobal -> statusFlags ));
258
+ ProcGlobal -> xids = (TransactionId * ) ptr ;
259
+ ptr = (char * ) ptr + (TotalProcs * sizeof (* ProcGlobal -> xids ));
260
+
261
+ ProcGlobal -> subxidStates = (XidCacheStatus * ) ptr ;
262
+ ptr = (char * ) ptr + (TotalProcs * sizeof (* ProcGlobal -> subxidStates ));
263
+
264
+ ProcGlobal -> statusFlags = (uint8 * ) ptr ;
265
+ ptr = (char * ) ptr + (TotalProcs * sizeof (* ProcGlobal -> statusFlags ));
266
+
267
+ /* make sure wer didn't overflow */
268
+ Assert ((ptr > (char * ) procs ) && (ptr <= (char * ) procs + requestSize ));
227
269
228
270
/*
229
271
* Allocate arrays for fast-path locks. Those are variable-length, so
@@ -233,11 +275,16 @@ InitProcGlobal(void)
233
275
fpLockBitsSize = MAXALIGN (FastPathLockGroupsPerBackend * sizeof (uint64 ));
234
276
fpRelIdSize = MAXALIGN (FastPathLockSlotsPerBackend () * sizeof (Oid ));
235
277
236
- fpPtr = ShmemAlloc (TotalProcs * (fpLockBitsSize + fpRelIdSize ));
237
- MemSet (fpPtr , 0 , TotalProcs * (fpLockBitsSize + fpRelIdSize ));
278
+ requestSize = FastPathLockShmemSize ();
279
+
280
+ fpPtr = ShmemInitStruct ("Fast-Path Lock Array" ,
281
+ requestSize ,
282
+ & found );
283
+
284
+ MemSet (fpPtr , 0 , requestSize );
238
285
239
286
/* For asserts checking we did not overflow. */
240
- fpEndPtr = fpPtr + ( TotalProcs * ( fpLockBitsSize + fpRelIdSize )) ;
287
+ fpEndPtr = fpPtr + requestSize ;
241
288
242
289
for (i = 0 ; i < TotalProcs ; i ++ )
243
290
{
@@ -330,7 +377,9 @@ InitProcGlobal(void)
330
377
PreparedXactProcs = & procs [MaxBackends + NUM_AUXILIARY_PROCS ];
331
378
332
379
/* Create ProcStructLock spinlock, too */
333
- ProcStructLock = (slock_t * ) ShmemAlloc (sizeof (slock_t ));
380
+ ProcStructLock = (slock_t * ) ShmemInitStruct ("ProcStructLock spinlock" ,
381
+ sizeof (slock_t ),
382
+ & found );
334
383
SpinLockInit (ProcStructLock );
335
384
}
336
385
0 commit comments