|
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.14 2003/05/02 21:59:31 momjian Exp $ |
| 16 | + * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.15 2003/05/03 03:52:07 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); |
|