From fb1f7ccec58d49f7b011fa16cf7dcfa15f9d3bd8 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 2 May 2003 21:52:42 +0000
Subject: [PATCH] Dump/read non-default GUC values for use by exec'ed backends,
 for Win32.

---
 src/backend/access/transam/clog.c   | 68 ++++++++++++++++++++---------
 src/backend/bootstrap/bootstrap.c   |  7 ++-
 src/backend/postmaster/postmaster.c | 15 ++++++-
 src/backend/storage/ipc/ipci.c      | 15 ++++++-
 src/backend/tcop/postgres.c         |  8 +++-
 src/include/miscadmin.h             |  3 +-
 src/include/storage/ipc.h           |  3 +-
 7 files changed, 90 insertions(+), 29 deletions(-)

diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c
index 74a6dc98b23..42e12b6282c 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.12 2003/04/14 17:31:33 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.13 2003/05/02 21:52:42 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);
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index f120192bc88..9c971ff9314 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -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.148 2003/03/06 00:04:27 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.149 2003/05/02 21:52:42 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)
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index e9a7d86f3d8..0e52aff2c50 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.315 2003/04/26 02:57:14 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.316 2003/05/02 21:52:42 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
  */
@@ -1403,7 +1410,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))
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c
index 68d922ff86f..094f3c145a2 100644
--- a/src/backend/storage/ipc/ipci.c
+++ b/src/backend/storage/ipc/ipci.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.49 2002/09/02 02:47:03 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.50 2003/05/02 21:52:42 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();
+}
+
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 6c2e456ccc1..2bd147cc57a 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.327 2003/05/02 20:54:35 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.328 2003/05/02 21:52:42 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.327 $ $Date: 2003/05/02 20:54:35 $\n");
+		puts("$Revision: 1.328 $ $Date: 2003/05/02 21:52:42 $\n");
 	}
 
 	/*
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index d4bd255cb0b..4b6a6621f00 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -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.118 2003/04/06 22:45:23 petere Exp $
+ * $Id: miscadmin.h,v 1.119 2003/05/02 21:52:42 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);
diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h
index d12ec20cfd6..0798ea4bb3d 100644
--- a/src/include/storage/ipc.h
+++ b/src/include/storage/ipc.h
@@ -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.57 2002/09/04 20:31:45 momjian Exp $
+ * $Id: ipc.h,v 1.58 2003/05/02 21:52:42 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 */
-- 
GitLab