]> granicus.if.org Git - postgresql/commitdiff
Handle clog structure in shared memory in exec() case, for Win32.
authorBruce Momjian <bruce@momjian.us>
Sat, 3 May 2003 03:52:07 +0000 (03:52 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 3 May 2003 03:52:07 +0000 (03:52 +0000)
src/backend/access/transam/clog.c
src/backend/bootstrap/bootstrap.c
src/backend/postmaster/postmaster.c
src/backend/storage/ipc/ipci.c
src/backend/tcop/postgres.c
src/include/miscadmin.h
src/include/storage/ipc.h

index 8b055aa960329c4fd35d566bbf1321fe65e5089e..3eb25f604eba8ce8dc0a7b824741b76f55d1c513 100644 (file)
@@ -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);
index 8040dd5bb844f49e039dee43d63ac6f204816ad3..d7db3cd375c078dd6165bb1015eec348cc2598dd 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.150 2003/05/02 21:59:31 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.151 2003/05/03 03:52:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -301,6 +301,11 @@ BootstrapMain(int argc, char *argv[])
 
        Assert(dbName);
 
+       if (IsUnderPostmaster && ExecBackend && MyProc /* ordinary backend */)
+       {
+               AttachSharedMemoryAndSemaphores();
+       }
+       
        if (!IsUnderPostmaster)
        {
                if (!potential_DataDir)
index 7e6c02e76a22234f28269e5dba3f4dc8077b00d5..767af51e9172b8d14292f18792ac75eaf571c7fb 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.319 2003/05/02 22:02:47 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.320 2003/05/03 03:52:07 momjian Exp $
  *
  * NOTES
  *
@@ -172,6 +172,13 @@ static int ServerSock_INET = INVALID_SOCK;         /* stream socket server */
 static int     ServerSock_UNIX = INVALID_SOCK;         /* stream socket server */
 #endif
 
+/* Used to reduce macros tests */
+#ifdef EXEC_BACKEND
+const bool ExecBackend = true;
+#else
+const bool ExecBackend = false;
+#endif
+
 /*
  * Set by the -o option
  */
@@ -1407,7 +1414,11 @@ processCancelRequest(Port *port, void *pkt)
                elog(DEBUG1, "processCancelRequest: CheckPointPID in cancel request for process %d", backendPID);
                return;
        }
-
+       else if (ExecBackend)
+       {
+               AttachSharedMemoryAndSemaphores();
+       }
+       
        /* See if we have a matching backend */
 
        for (curr = DLGetHead(BackendList); curr; curr = DLGetSucc(curr))
index ae27a3ce4019aa1e2b692570089c7618bf6f4b8a..c19fee1d28ccd43d00e0896ed853712d7b250aa2 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.51 2003/05/02 21:59:31 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.52 2003/05/03 03:52:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -134,3 +134,16 @@ CreateSharedMemoryAndSemaphores(bool makePrivate,
         */
        PMSignalInit();
 }
+
+
+/*
+ * AttachSharedMemoryAndSemaphores
+ *             Attaches to the existing shared resources when exec()'d off
+ *             by the postmaster.
+ */
+void
+AttachSharedMemoryAndSemaphores(void)
+{
+       CLOGShmemInit();
+}
+
index e201bc77e59c73322a32a8e0fa71298ed1195754..76d958b4999b304572ddd070ccedbacb6336bad0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.329 2003/05/02 21:59:31 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.330 2003/05/03 03:52:07 momjian Exp $
  *
  * NOTES
  *       this is the "main" module of the postgres backend and
@@ -1453,6 +1453,7 @@ PostgresMain(int argc, char *argv[], const char *username)
                                break;
                }
 
+
        /*
         * -d is not the same as setting
         * log_min_messages because it enables other
@@ -1577,6 +1578,9 @@ PostgresMain(int argc, char *argv[], const char *username)
                                                                 * restart... */
                }
                BaseInit();
+#ifdef EXECBACKEND
+               AttachSharedMemoryAndSemaphores();
+#endif
        }
        else
        {
@@ -1672,7 +1676,7 @@ PostgresMain(int argc, char *argv[], const char *username)
        if (!IsUnderPostmaster)
        {
                puts("\nPOSTGRES backend interactive interface ");
-               puts("$Revision: 1.329 $ $Date: 2003/05/02 21:59:31 $\n");
+               puts("$Revision: 1.330 $ $Date: 2003/05/03 03:52:07 $\n");
        }
 
        /*
index ce2fad6d4a445e3627bf7bb7ec6b973b99aa0e1c..18781c5dc526697b5eaea66f76e48b3d29239a12 100644 (file)
@@ -12,7 +12,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: miscadmin.h,v 1.120 2003/05/02 21:59:31 momjian Exp $
+ * $Id: miscadmin.h,v 1.121 2003/05/03 03:52:07 momjian Exp $
  *
  * NOTES
  *       some of the information in this file should be moved to
@@ -106,6 +106,7 @@ extern void ProcessInterrupts(void);
  */
 extern bool IsUnderPostmaster;
 extern bool ClientAuthInProgress;
+extern const bool ExecBackend;
 
 extern int     PostmasterMain(int argc, char *argv[]);
 extern void ClosePostmasterPorts(bool pgstat_too);
index a01dc2cb223f4d943dddbca15d331a2ecb3af061..24a7acdf2e31ee9c76d03852a5d95336ed115fb3 100644 (file)
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: ipc.h,v 1.59 2003/05/02 21:59:31 momjian Exp $
+ * $Id: ipc.h,v 1.60 2003/05/03 03:52:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -32,5 +32,6 @@ extern void on_exit_reset(void);
 extern void CreateSharedMemoryAndSemaphores(bool makePrivate,
                                                                int maxBackends,
                                                                int port);
+extern void AttachSharedMemoryAndSemaphores(void);
 
 #endif   /* IPC_H */