mirror of
https://github.com/postgres/postgres.git
synced 2025-11-12 05:01:15 +03:00
Apply Bryan's IPC Patches
From: Bryan Henderson <bryanh@giraffe.netgate.net>
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.61 1997/11/10 05:10:21 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.62 1997/11/17 03:47:28 scrappy Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
@@ -123,6 +123,32 @@ static Dllist *PortList;
|
||||
|
||||
static short PostPortName = -1;
|
||||
static short ActiveBackends = FALSE;
|
||||
/* This is a boolean indicating that there is at least one backend
|
||||
that is accessing the current shared memory and semaphores.
|
||||
Between the time that we start up, or throw away shared memory
|
||||
segments and start over, and the time we generate the next
|
||||
backend (because we received a connection request), it is false.
|
||||
Other times, it is true.
|
||||
*/
|
||||
static short shmem_seq = 0;
|
||||
/* This is a sequence number that indicates how many times we've had
|
||||
to throw away the shared memory and start over because we doubted
|
||||
its integrity. It starts off at zero and is incremented every
|
||||
time we start over. We use this to ensure that we use a new
|
||||
IPC shared memory key for the new shared memory segment in case
|
||||
the old segment isn't entirely gone yet.
|
||||
|
||||
The sequence actually cycles back to 0 after 9, so pathologically
|
||||
there could be an IPC failure if 10 sets of backends are all stuck
|
||||
and won't release IPC resources.
|
||||
*/
|
||||
|
||||
static IpcMemoryKey ipc_key;
|
||||
/* This is the base IPC shared memory key. Other keys are generated by
|
||||
adding to this.
|
||||
*/
|
||||
|
||||
|
||||
static int NextBackendId = MAXINT; /* XXX why? */
|
||||
static char *progname = (char *) NULL;
|
||||
|
||||
@@ -904,11 +930,11 @@ ConnCreate(int serverFd, int *newFdP)
|
||||
static void
|
||||
reset_shared(short port)
|
||||
{
|
||||
IPCKey key;
|
||||
|
||||
key = SystemPortAddressCreateIPCKey((SystemPortAddress) port);
|
||||
CreateSharedMemoryAndSemaphores(key);
|
||||
ActiveBackends = FALSE;
|
||||
ipc_key = port * 1000 + shmem_seq * 100;
|
||||
CreateSharedMemoryAndSemaphores(ipc_key);
|
||||
ActiveBackends = FALSE;
|
||||
shmem_seq += 1;
|
||||
if (shmem_seq >= 10) shmem_seq -= 10;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1079,9 +1105,10 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
|
||||
Backend *bn; /* for backend cleanup */
|
||||
int pid,
|
||||
i;
|
||||
static char envEntry[4][2 * ARGV_SIZE];
|
||||
#define NR_ENVIRONMENT_VBL 5
|
||||
static char envEntry[NR_ENVIRONMENT_VBL][2 * ARGV_SIZE];
|
||||
|
||||
for (i = 0; i < 4; ++i)
|
||||
for (i = 0; i < NR_ENVIRONMENT_VBL; ++i)
|
||||
{
|
||||
MemSet(envEntry[i], 0, 2 * ARGV_SIZE);
|
||||
}
|
||||
@@ -1101,6 +1128,9 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
|
||||
sprintf(envEntry[3], "PGDATA=%s", DataDir);
|
||||
putenv(envEntry[3]);
|
||||
}
|
||||
sprintf(envEntry[4], "IPC_KEY=%d", ipc_key);
|
||||
putenv(envEntry[4]);
|
||||
|
||||
if (DebugLvl > 2)
|
||||
{
|
||||
char **p;
|
||||
|
||||
Reference in New Issue
Block a user