|
13 | 13 | * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
14 | 14 | * Portions Copyright (c) 1994, Regents of the University of California
|
15 | 15 | *
|
16 |
| - * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.12 2003/04/14 17:31:33 tgl Exp $ |
| 16 | + * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.13 2003/05/02 21:52:42 momjian Exp $ |
17 | 17 | *
|
18 | 18 | *-------------------------------------------------------------------------
|
19 | 19 | */
|
@@ -157,7 +157,7 @@ static ClogCtlData *ClogCtl = NULL;
|
157 | 157 | * The value is automatically inherited by backends via fork, and
|
158 | 158 | * doesn't need to be in shared memory.
|
159 | 159 | */
|
160 |
| -staticLWLockIdClogBufferLocks[NUM_CLOG_BUFFERS];/* Per-buffer I/O locks */ |
| 160 | +staticLWLockId*ClogBufferLocks;/* Per-buffer I/O locks */ |
161 | 161 |
|
162 | 162 | /*
|
163 | 163 | * ClogDir is set during CLOGShmemInit and does not change thereafter.
|
@@ -271,41 +271,67 @@ TransactionIdGetStatus(TransactionId xid)
|
271 | 271 | /*
|
272 | 272 | * Initialization of shared memory for CLOG
|
273 | 273 | */
|
274 |
| - |
275 | 274 | int
|
276 | 275 | CLOGShmemSize(void)
|
277 | 276 | {
|
278 |
| -returnMAXALIGN(sizeof(ClogCtlData)+CLOG_BLCKSZ*NUM_CLOG_BUFFERS); |
| 277 | +returnMAXALIGN(sizeof(ClogCtlData)+CLOG_BLCKSZ*NUM_CLOG_BUFFERS) |
| 278 | +#ifdefEXEC_BACKEND |
| 279 | ++MAXALIGN(NUM_CLOG_BUFFERS*sizeof(LWLockId)) |
| 280 | +#endif |
| 281 | +; |
279 | 282 | }
|
280 | 283 |
|
| 284 | + |
281 | 285 | void
|
282 | 286 | CLOGShmemInit(void)
|
283 | 287 | {
|
284 | 288 | boolfound;
|
285 |
| -char*bufptr; |
286 | 289 | intslotno;
|
287 | 290 |
|
| 291 | +/* Handle ClogCtl */ |
| 292 | + |
288 | 293 | /* this must agree with space requested by CLOGShmemSize() */
|
289 |
| -ClogCtl= (ClogCtlData*) |
290 |
| -ShmemInitStruct("CLOG Ctl", |
291 |
| -MAXALIGN(sizeof(ClogCtlData)+ |
292 |
| -CLOG_BLCKSZ*NUM_CLOG_BUFFERS), |
293 |
| -&found); |
294 |
| -Assert(!found); |
| 294 | +ClogCtl= (ClogCtlData*)ShmemInitStruct("CLOG Ctl", |
| 295 | +MAXALIGN(sizeof(ClogCtlData)+ |
| 296 | +CLOG_BLCKSZ*NUM_CLOG_BUFFERS),&found); |
295 | 297 |
|
296 |
| -memset(ClogCtl,0,sizeof(ClogCtlData)); |
| 298 | +if (!IsUnderPostmaster) |
| 299 | +/* Initialize ClogCtl shared memory area */ |
| 300 | +{ |
| 301 | +char*bufptr; |
297 | 302 |
|
298 |
| -bufptr= ((char*)ClogCtl)+sizeof(ClogCtlData); |
| 303 | +Assert(!found); |
299 | 304 |
|
300 |
| -for (slotno=0;slotno<NUM_CLOG_BUFFERS;slotno++) |
301 |
| -{ |
302 |
| -ClogCtl->page_buffer[slotno]=bufptr; |
303 |
| -ClogCtl->page_status[slotno]=CLOG_PAGE_EMPTY; |
304 |
| -ClogBufferLocks[slotno]=LWLockAssign(); |
305 |
| -bufptr+=CLOG_BLCKSZ; |
306 |
| -} |
| 305 | +memset(ClogCtl,0,sizeof(ClogCtlData)); |
| 306 | + |
| 307 | +bufptr= (char*)ClogCtl+sizeof(ClogCtlData); |
| 308 | + |
| 309 | +for (slotno=0;slotno<NUM_CLOG_BUFFERS;slotno++) |
| 310 | +{ |
| 311 | +ClogCtl->page_buffer[slotno]=bufptr; |
| 312 | +ClogCtl->page_status[slotno]=CLOG_PAGE_EMPTY; |
| 313 | +bufptr+=CLOG_BLCKSZ; |
| 314 | +} |
307 | 315 |
|
308 |
| -/* ClogCtl->latest_page_number will be set later */ |
| 316 | +/* ClogCtl->latest_page_number will be set later */ |
| 317 | +} |
| 318 | +else |
| 319 | +Assert(found); |
| 320 | + |
| 321 | +/* Handle ClogBufferLocks */ |
| 322 | + |
| 323 | +#ifdefEXEC_BACKEND |
| 324 | +ClogBufferLocks= (LWLockId*)ShmemInitStruct("CLOG Buffer Locks", |
| 325 | +NUM_CLOG_BUFFERS*sizeof(LWLockId),&found); |
| 326 | +Assert((!found&& !IsUnderPostmaster)|| (found&&IsUnderPostmaster)); |
| 327 | +#else |
| 328 | +ClogBufferLocks=malloc(NUM_CLOG_BUFFERS*sizeof(LWLockId)); |
| 329 | +Assert(ClogBufferLocks); |
| 330 | +#endif |
| 331 | + |
| 332 | +if (!IsUnderPostmaster) |
| 333 | +for (slotno=0;slotno<NUM_CLOG_BUFFERS;slotno++) |
| 334 | +ClogBufferLocks[slotno]=LWLockAssign(); |
309 | 335 |
|
310 | 336 | /* Init CLOG directory path */
|
311 | 337 | snprintf(ClogDir,MAXPGPATH,"%s/pg_clog",DataDir);
|
|