aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/clog.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2003-05-03 03:52:07 +0000
committerBruce Momjian <bruce@momjian.us>2003-05-03 03:52:07 +0000
commita7fd03e1de38aa515bf13f590eb7688bb8418195 (patch)
treeeec75ded6e712fef1a85930bd46ab366dd8a5b70 /src/backend/access/transam/clog.c
parent36fa2974976550ef5a8ec93f25c954fefcc76296 (diff)
downloadpostgresql-a7fd03e1de38aa515bf13f590eb7688bb8418195.tar.gz
postgresql-a7fd03e1de38aa515bf13f590eb7688bb8418195.zip
Handle clog structure in shared memory in exec() case, for Win32.
Diffstat (limited to 'src/backend/access/transam/clog.c')
-rw-r--r--src/backend/access/transam/clog.c68
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);