diff options
Diffstat (limited to 'src/backend/access/transam/clog.c')
-rw-r--r-- | src/backend/access/transam/clog.c | 68 |
1 files changed, 47 insertions, 21 deletions
diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 8b055aa9603..3eb25f604eb 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -13,7 +13,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.14 2003/05/02 21:59:31 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.15 2003/05/03 03:52:07 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -157,7 +157,7 @@ static ClogCtlData *ClogCtl = NULL; * The value is automatically inherited by backends via fork, and * doesn't need to be in shared memory. */ -static LWLockId ClogBufferLocks[NUM_CLOG_BUFFERS]; /* Per-buffer I/O locks */ +static LWLockId *ClogBufferLocks; /* Per-buffer I/O locks */ /* * ClogDir is set during CLOGShmemInit and does not change thereafter. @@ -271,41 +271,67 @@ TransactionIdGetStatus(TransactionId xid) /* * Initialization of shared memory for CLOG */ - int CLOGShmemSize(void) { - return MAXALIGN(sizeof(ClogCtlData) + CLOG_BLCKSZ * NUM_CLOG_BUFFERS); + return MAXALIGN(sizeof(ClogCtlData) + CLOG_BLCKSZ * NUM_CLOG_BUFFERS) +#ifdef EXEC_BACKEND + + MAXALIGN(NUM_CLOG_BUFFERS * sizeof(LWLockId)) +#endif + ; } + void CLOGShmemInit(void) { bool found; - char *bufptr; int slotno; + /* Handle ClogCtl */ + /* this must agree with space requested by CLOGShmemSize() */ - ClogCtl = (ClogCtlData *) - ShmemInitStruct("CLOG Ctl", - MAXALIGN(sizeof(ClogCtlData) + - CLOG_BLCKSZ * NUM_CLOG_BUFFERS), - &found); - Assert(!found); + ClogCtl = (ClogCtlData *) ShmemInitStruct("CLOG Ctl", + MAXALIGN(sizeof(ClogCtlData) + + CLOG_BLCKSZ * NUM_CLOG_BUFFERS), &found); - memset(ClogCtl, 0, sizeof(ClogCtlData)); + if (!IsUnderPostmaster) + /* Initialize ClogCtl shared memory area */ + { + char *bufptr; - bufptr = ((char *) ClogCtl) + sizeof(ClogCtlData); + Assert(!found); - for (slotno = 0; slotno < NUM_CLOG_BUFFERS; slotno++) - { - ClogCtl->page_buffer[slotno] = bufptr; - ClogCtl->page_status[slotno] = CLOG_PAGE_EMPTY; - ClogBufferLocks[slotno] = LWLockAssign(); - bufptr += CLOG_BLCKSZ; - } + memset(ClogCtl, 0, sizeof(ClogCtlData)); + + bufptr = (char *)ClogCtl + sizeof(ClogCtlData); + + for (slotno = 0; slotno < NUM_CLOG_BUFFERS; slotno++) + { + ClogCtl->page_buffer[slotno] = bufptr; + ClogCtl->page_status[slotno] = CLOG_PAGE_EMPTY; + bufptr += CLOG_BLCKSZ; + } - /* ClogCtl->latest_page_number will be set later */ + /* ClogCtl->latest_page_number will be set later */ + } + else + Assert(found); + + /* Handle ClogBufferLocks */ + +#ifdef EXEC_BACKEND + ClogBufferLocks = (LWLockId *) ShmemInitStruct("CLOG Buffer Locks", + NUM_CLOG_BUFFERS * sizeof(LWLockId), &found); + Assert((!found && !IsUnderPostmaster) || (found && IsUnderPostmaster)); +#else + ClogBufferLocks = malloc(NUM_CLOG_BUFFERS * sizeof(LWLockId)); + Assert(ClogBufferLocks); +#endif + + if (!IsUnderPostmaster) + for (slotno = 0; slotno < NUM_CLOG_BUFFERS; slotno++) + ClogBufferLocks[slotno] = LWLockAssign(); /* Init CLOG directory path */ snprintf(ClogDir, MAXPGPATH, "%s/pg_clog", DataDir); |