Fix for hang after postmaster restart. Add new proc_exit and

shmem_exit to replace exitpg().
This commit is contained in:
Bruce Momjian 1998-06-27 04:53:49 +00:00
parent 8fa93b016a
commit e747c58718
18 changed files with 130 additions and 123 deletions

View File

@ -7,7 +7,7 @@
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.43 1998/06/15 19:28:04 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.44 1998/06/27 04:53:29 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -262,7 +262,7 @@ usage(void)
fprintf(stderr, " O: set BootstrapProcessing mode\n"); fprintf(stderr, " O: set BootstrapProcessing mode\n");
fprintf(stderr, " P portno: specify port number\n"); fprintf(stderr, " P portno: specify port number\n");
exitpg(1); proc_exit(1);
} }
@ -360,7 +360,7 @@ BootstrapMain(int argc, char *argv[])
"database system either by specifying the -D invocation " "database system either by specifying the -D invocation "
"option or by setting the PGDATA environment variable.\n\n", "option or by setting the PGDATA environment variable.\n\n",
argv[0]); argv[0]);
exitpg(1); proc_exit(1);
} }
if (dbName == NULL) if (dbName == NULL)
@ -370,7 +370,7 @@ BootstrapMain(int argc, char *argv[])
{ {
fputs("bootstrap backend: failed, no db name specified\n", stderr); fputs("bootstrap backend: failed, no db name specified\n", stderr);
fputs(" and no USER enviroment variable\n", stderr); fputs(" and no USER enviroment variable\n", stderr);
exitpg(1); proc_exit(1);
} }
} }
@ -381,7 +381,7 @@ BootstrapMain(int argc, char *argv[])
if (IsUnderPostmaster && portFd < 0) if (IsUnderPostmaster && portFd < 0)
{ {
fputs("backend: failed, no -P option with -postmaster opt.\n", stderr); fputs("backend: failed, no -P option with -postmaster opt.\n", stderr);
exitpg(1); proc_exit(1);
} }
/* ---------------- /* ----------------
@ -770,12 +770,12 @@ cleanup()
else else
{ {
elog(FATAL, "Memory manager fault: cleanup called twice.\n", stderr); elog(FATAL, "Memory manager fault: cleanup called twice.\n", stderr);
exitpg(1); proc_exit(1);
} }
if (reldesc != (Relation) NULL) if (reldesc != (Relation) NULL)
heap_close(reldesc); heap_close(reldesc);
CommitTransactionCommand(); CommitTransactionCommand();
exitpg(Warnings); proc_exit(Warnings);
} }
/* ---------------- /* ----------------

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.33 1998/06/15 19:28:11 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.34 1998/06/27 04:53:29 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -477,7 +477,7 @@ Async_Listen(char *relname, int pid)
*/ */
relnamei = malloc(NAMEDATALEN); /* persists to process exit */ relnamei = malloc(NAMEDATALEN); /* persists to process exit */
StrNCpy(relnamei, relname, NAMEDATALEN); StrNCpy(relnamei, relname, NAMEDATALEN);
on_exitpg(Async_UnlistenOnExit, (caddr_t) relnamei); on_shmem_exit(Async_UnlistenOnExit, (caddr_t) relnamei);
} }
/* /*

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.46 1998/06/21 16:39:10 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.47 1998/06/27 04:53:30 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -650,7 +650,7 @@ StreamServerPort(char *hostName, short portName, int *fdP)
} }
if (family == AF_UNIX) if (family == AF_UNIX)
on_exitpg(StreamDoUnlink, NULL); on_proc_exit(StreamDoUnlink, NULL);
listen(fd, SOMAXCONN); listen(fd, SOMAXCONN);

View File

@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.89 1998/06/18 03:43:59 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.90 1998/06/27 04:53:31 momjian Exp $
* *
* NOTES * NOTES
* *
@ -895,7 +895,7 @@ reset_shared(short port)
static void static void
pmdie(SIGNAL_ARGS) pmdie(SIGNAL_ARGS)
{ {
exitpg(0); proc_exit(0);
} }
/* /*
@ -986,9 +986,9 @@ CleanupProc(int pid,
{ {
bp = (Backend *) DLE_VAL(curr); bp = (Backend *) DLE_VAL(curr);
/* /* -----------------
* ----------------- SIGUSR1 is the special signal that sez exit * SIGUSR1 is the special signal that says exit
* without exitpg and let the user know what's going on. * without proc_exit and let the user know what's going on.
* ProcSemaphoreKill() cleans up the backends semaphore. If * ProcSemaphoreKill() cleans up the backends semaphore. If
* SendStop is set (-s on command line), then we send a SIGSTOP so * SendStop is set (-s on command line), then we send a SIGSTOP so
* that we can core dumps from all backends by hand. * that we can core dumps from all backends by hand.
@ -1020,10 +1020,6 @@ CleanupProc(int pid,
} }
/* /*
* Quasi_exit means run all of the on_exitpg routines
* but don't acutally call exit(). The on_exit list of routines to do
* is also truncated.
*
* Nothing up my sleeve here, ActiveBackends means that since the last * Nothing up my sleeve here, ActiveBackends means that since the last
* time we recreated shared memory and sems another frontend has * time we recreated shared memory and sems another frontend has
* requested and received a connection and I have forked off another * requested and received a connection and I have forked off another
@ -1036,7 +1032,7 @@ CleanupProc(int pid,
if (DebugLvl) if (DebugLvl)
fprintf(stderr, "%s: CleanupProc: reinitializing shared memory and semaphores\n", fprintf(stderr, "%s: CleanupProc: reinitializing shared memory and semaphores\n",
progname); progname);
quasi_exitpg(); shmem_exit();
reset_shared(PostPortName); reset_shared(PostPortName);
} }
} }
@ -1230,7 +1226,7 @@ DoBackend(Port *port)
* Let's clean up ourselves as the postmaster child * Let's clean up ourselves as the postmaster child
*/ */
clear_exitpg(); /* we don't want the postmaster's exitpg() handlers */ clear_proc_exit(); /* we don't want the postmaster's proc_exit() handlers */
/* ---------------- /* ----------------
* register signal handlers. * register signal handlers.
@ -1352,7 +1348,7 @@ ExitPostmaster(int status)
StreamClose(ServerSock_INET); StreamClose(ServerSock_INET);
if (ServerSock_UNIX != INVALID_SOCK) if (ServerSock_UNIX != INVALID_SOCK)
StreamClose(ServerSock_UNIX); StreamClose(ServerSock_UNIX);
exitpg(status); proc_exit(status);
} }
static void static void

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.26 1998/06/23 16:04:46 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.27 1998/06/27 04:53:34 momjian Exp $
* *
* NOTES * NOTES
* *
@ -60,9 +60,9 @@ static struct ONEXIT
{ {
void (*function) (); void (*function) ();
caddr_t arg; caddr_t arg;
} onexit_list[MAX_ON_EXITS]; } on_proc_exit_list[MAX_ON_EXITS], on_shmem_exit_list[MAX_ON_EXITS];
static int onexit_index; static int on_proc_exit_index, on_shmem_exit_index;
static void IpcConfigTip(void); static void IpcConfigTip(void);
typedef struct _PrivateMemStruct typedef struct _PrivateMemStruct
@ -98,7 +98,7 @@ PrivateMemoryAttach(IpcMemoryId memid)
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
* exitpg * proc_exit
* *
* this function calls all the callbacks registered * this function calls all the callbacks registered
* for it (to free resources) and then calls exit. * for it (to free resources) and then calls exit.
@ -106,100 +106,124 @@ PrivateMemoryAttach(IpcMemoryId memid)
* -cim 2/6/90 * -cim 2/6/90
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
static int exitpg_inprogress = 0; static int proc_exit_inprogress = 0;
void void
exitpg(int code) proc_exit(int code)
{ {
int i; int i;
/* ---------------- /* ----------------
* if exitpg_inprocess is true, then it means that we * if proc_exit_inprocess is true, then it means that we
* are being invoked from within an on_exit() handler * are being invoked from within an on_exit() handler
* and so we return immediately to avoid recursion. * and so we return immediately to avoid recursion.
* ---------------- * ----------------
*/ */
if (exitpg_inprogress) if (proc_exit_inprogress)
return; return;
exitpg_inprogress = 1; proc_exit_inprogress = 1;
/* do our shared memory exits first */
shmem_exit(code);
/* ---------------- /* ----------------
* call all the callbacks registered before calling exit(). * call all the callbacks registered before calling exit().
* ---------------- * ----------------
*/ */
for (i = onexit_index - 1; i >= 0; --i) for (i = on_proc_exit_index - 1; i >= 0; --i)
(*onexit_list[i].function) (code, onexit_list[i].arg); (*on_proc_exit_list[i].function) (code, on_proc_exit_list[i].arg);
exit(code); exit(code);
} }
/* ------------------ /* ------------------
* Run all of the on_exitpg routines but don't exit in the end. * Run all of the on_shmem_exit routines but don't exit in the end.
* This is used by the postmaster to re-initialize shared memory and * This is used by the postmaster to re-initialize shared memory and
* semaphores after a backend dies horribly * semaphores after a backend dies horribly
* ------------------ * ------------------
*/ */
static int shmem_exit_inprogress = 0;
void void
quasi_exitpg() shmem_exit(int code)
{ {
int i; int i;
/* ---------------- /* ----------------
* if exitpg_inprocess is true, then it means that we * if shmem_exit_inprocess is true, then it means that we
* are being invoked from within an on_exit() handler * are being invoked from within an on_exit() handler
* and so we return immediately to avoid recursion. * and so we return immediately to avoid recursion.
* ---------------- * ----------------
*/ */
if (exitpg_inprogress) if (shmem_exit_inprogress)
return; return;
exitpg_inprogress = 1; shmem_exit_inprogress = 1;
/* ---------------- /* ----------------
* call all the callbacks registered before calling exit(). * call all the callbacks registered before calling exit().
* ---------------- * ----------------
*/ */
for (i = onexit_index - 1; i >= 0; --i) for (i = on_shmem_exit_index - 1; i >= 0; --i)
/* Don't do StreamDoUnlink on quasi_exit */ (*on_shmem_exit_list[i].function) (code, on_shmem_exit_list[i].arg);
if (onexit_list[i].function != StreamDoUnlink)
(*onexit_list[i].function) (0, onexit_list[i].arg);
onexit_index = 0; on_shmem_exit_index = 0;
exitpg_inprogress = 0; shmem_exit_inprogress = 0;
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
* on_exitpg * on_proc_exit
* *
* this function adds a callback function to the list of * this function adds a callback function to the list of
* functions invoked by exitpg(). -cim 2/6/90 * functions invoked by proc_exit(). -cim 2/6/90
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
int int
on_exitpg(void (*function) (), caddr_t arg) on_proc_exit(void (*function) (), caddr_t arg)
{ {
if (onexit_index >= MAX_ON_EXITS) if (on_proc_exit_index >= MAX_ON_EXITS)
return (-1); return (-1);
onexit_list[onexit_index].function = function; on_proc_exit_list[on_proc_exit_index].function = function;
onexit_list[onexit_index].arg = arg; on_proc_exit_list[on_proc_exit_index].arg = arg;
++onexit_index; ++on_proc_exit_index;
return (0); return (0);
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
* clear_exitpg * on_shmem_exit
* *
* this function clears all exitpg() registered functions. * this function adds a callback function to the list of
* functions invoked by shmem_exit(). -cim 2/6/90
* ----------------------------------------------------------------
*/
int
on_shmem_exit(void (*function) (), caddr_t arg)
{
if (on_shmem_exit_index >= MAX_ON_EXITS)
return (-1);
on_shmem_exit_list[on_shmem_exit_index].function = function;
on_shmem_exit_list[on_shmem_exit_index].arg = arg;
++on_shmem_exit_index;
return (0);
}
/* ----------------------------------------------------------------
* clear_proc_exit
*
* this function clears all proc_exit() registered functions.
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
void void
clear_exitpg(void) clear_proc_exit(void)
{ {
onexit_index = 0; on_proc_exit_index = 0;
} }
/****************************************************************************/ /****************************************************************************/
@ -301,7 +325,7 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey,
{ {
perror("semget"); perror("semget");
IpcConfigTip(); IpcConfigTip();
exitpg(3); proc_exit(3);
} }
for (i = 0; i < semNum; i++) for (i = 0; i < semNum; i++)
array[i] = semStartValue; array[i] = semStartValue;
@ -314,7 +338,7 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey,
} }
if (removeOnExit) if (removeOnExit)
on_exitpg(IPCPrivateSemaphoreKill, (caddr_t) semId); on_shmem_exit(IPCPrivateSemaphoreKill, (caddr_t) semId);
} }
else else
@ -418,7 +442,7 @@ IpcSemaphoreLock(IpcSemaphoreId semId, int sem, int lock)
{ {
perror("semop"); perror("semop");
IpcConfigTip(); IpcConfigTip();
exitpg(255); proc_exit(255);
} }
} }
@ -463,7 +487,7 @@ IpcSemaphoreUnlock(IpcSemaphoreId semId, int sem, int lock)
{ {
perror("semop"); perror("semop");
IpcConfigTip(); IpcConfigTip();
exitpg(255); proc_exit(255);
} }
} }
@ -517,7 +541,7 @@ IpcMemoryCreate(IpcMemoryKey memKey, uint32 size, int permission)
} }
/* if (memKey == PrivateIPCKey) */ /* if (memKey == PrivateIPCKey) */
on_exitpg(IPCPrivateMemoryKill, (caddr_t) shmid); on_shmem_exit(IPCPrivateMemoryKill, (caddr_t) shmid);
return (shmid); return (shmid);
} }
@ -583,7 +607,7 @@ IpcMemoryAttach(IpcMemoryId memId)
} }
if (!UsePrivateMemory) if (!UsePrivateMemory)
on_exitpg(IpcMemoryDetach, (caddr_t) memAddress); on_shmem_exit(IpcMemoryDetach, (caddr_t) memAddress);
return ((char *) memAddress); return ((char *) memAddress);
} }

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.13 1998/06/26 19:57:48 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.14 1998/06/27 04:53:35 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -92,7 +92,6 @@ CreateSharedMemoryAndSemaphores(IPCKey key)
* ---------------- * ----------------
*/ */
InitLocks(); InitLocks();
InitMultiLevelLocks();
if (InitMultiLevelLocks() == INVALID_TABLEID) if (InitMultiLevelLocks() == INVALID_TABLEID)
elog(FATAL, "Couldn't create the lock table"); elog(FATAL, "Couldn't create the lock table");
@ -101,7 +100,7 @@ CreateSharedMemoryAndSemaphores(IPCKey key)
* ---------------- * ----------------
*/ */
InitProcGlobal(key); InitProcGlobal(key);
on_exitpg(ProcFreeAllSemaphores, NULL); on_shmem_exit(ProcFreeAllSemaphores, NULL);
CreateSharedInvalidationState(key); CreateSharedInvalidationState(key);
} }

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.22 1998/06/25 14:24:34 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.23 1998/06/27 04:53:36 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -524,7 +524,7 @@ ShmemInitStruct(char *name, unsigned long size, bool *foundPtr)
} }
else else
{ {
/* look it up in the bindint table */ /* look it up in the binding table */
result = (BindingEnt *) result = (BindingEnt *)
hash_search(BindingTable, (char *) &item, HASH_ENTER, foundPtr); hash_search(BindingTable, (char *) &item, HASH_ENTER, foundPtr);
} }

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.10 1998/06/18 04:20:34 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.11 1998/06/27 04:53:36 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -100,7 +100,7 @@ SIBackendInit(SISeg *segInOutP)
#endif /* INVALIDDEBUG */ #endif /* INVALIDDEBUG */
SISetActiveProcess(segInOutP, MyBackendId); SISetActiveProcess(segInOutP, MyBackendId);
on_exitpg(CleanupInvalidationState, (caddr_t) segInOutP); on_shmem_exit(CleanupInvalidationState, (caddr_t) segInOutP);
return 1; return 1;
} }
@ -193,7 +193,7 @@ SISetDeadProcess(SISeg *segP, int backendId)
* CleanupInvalidationState -- * CleanupInvalidationState --
* Note: * Note:
* This is a temporary hack. ExitBackend should call this instead * This is a temporary hack. ExitBackend should call this instead
* of exit (via on_exitpg). * of exit (via on_shmem_exit).
*/ */
static void static void
CleanupInvalidationState(int status, /* XXX */ CleanupInvalidationState(int status, /* XXX */

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.28 1998/06/26 01:58:45 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.29 1998/06/27 04:53:37 momjian Exp $
* *
* NOTES * NOTES
* Outside modules can create a lock table and acquire/release * Outside modules can create a lock table and acquire/release
@ -153,7 +153,7 @@ static LOCKTAB *AllTables[MAX_TABLES];
* no zero-th table * no zero-th table
* ------------------- * -------------------
*/ */
static int NumTables = 1; static int NumTables;
/* ------------------- /* -------------------
* InitLocks -- Init the lock module. Create a private data * InitLocks -- Init the lock module. Create a private data
@ -242,14 +242,6 @@ LockTableInit(char *tabName,
return (INVALID_TABLEID); return (INVALID_TABLEID);
} }
if (NumTables > MAX_TABLES)
{
elog(NOTICE,
"LockTableInit: system limit of MAX_TABLES (%d) lock tables",
MAX_TABLES);
return (INVALID_TABLEID);
}
/* allocate a string for the binding table lookup */ /* allocate a string for the binding table lookup */
shmemName = (char *) palloc((unsigned) (strlen(tabName) + 32)); shmemName = (char *) palloc((unsigned) (strlen(tabName) + 32));
if (!shmemName) if (!shmemName)
@ -289,6 +281,8 @@ LockTableInit(char *tabName,
status = FALSE; status = FALSE;
} }
NumTables = 1;
/* ---------------- /* ----------------
* we're first - initialize * we're first - initialize
* ---------------- * ----------------

View File

@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/Attic/multi.c,v 1.16 1998/06/26 19:57:49 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/Attic/multi.c,v 1.17 1998/06/27 04:53:38 momjian Exp $
* *
* NOTES: * NOTES:
* (1) The lock.c module assumes that the caller here is doing * (1) The lock.c module assumes that the caller here is doing
@ -89,13 +89,6 @@ InitMultiLevelLocks()
{ {
int tableId; int tableId;
/* -----------------------
* If we're already initialized just return the table id.
* -----------------------
*/
if (MultiTableId)
return MultiTableId;
tableId = LockTableInit("LockTable", MultiConflicts, MultiPrios, 5); tableId = LockTableInit("LockTable", MultiConflicts, MultiPrios, 5);
MultiTableId = tableId; MultiTableId = tableId;
if (!(MultiTableId)) if (!(MultiTableId))

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.36 1998/06/19 02:55:11 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.37 1998/06/27 04:53:39 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -46,7 +46,7 @@
* This is so that we can support more backends. (system-wide semaphore * This is so that we can support more backends. (system-wide semaphore
* sets run out pretty fast.) -ay 4/95 * sets run out pretty fast.) -ay 4/95
* *
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.36 1998/06/19 02:55:11 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.37 1998/06/27 04:53:39 momjian Exp $
*/ */
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
@ -274,7 +274,7 @@ InitProcess(IPCKey key)
MyProc->errType = NO_ERROR; MyProc->errType = NO_ERROR;
SHMQueueElemInit(&(MyProc->links)); SHMQueueElemInit(&(MyProc->links));
on_exitpg(ProcKill, (caddr_t) MyProcPid); on_shmem_exit(ProcKill, (caddr_t) MyProcPid);
ProcInitialized = TRUE; ProcInitialized = TRUE;
} }

View File

@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.16 1998/06/23 15:35:45 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.17 1998/06/27 04:53:40 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -100,7 +100,7 @@ smgrinit()
} }
/* register the shutdown proc */ /* register the shutdown proc */
on_exitpg(smgrshutdown, NULL); on_proc_exit(smgrshutdown, NULL);
return (SM_SUCCESS); return (SM_SUCCESS);
} }

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.77 1998/06/16 07:29:30 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.78 1998/06/27 04:53:43 momjian Exp $
* *
* NOTES * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
@ -263,7 +263,7 @@ InteractiveBackend(char *inBuf)
if (!Quiet) if (!Quiet)
puts("EOF"); puts("EOF");
IsEmptyQuery = true; IsEmptyQuery = true;
exitpg(0); proc_exit(0);
} }
/* ---------------- /* ----------------
@ -312,7 +312,7 @@ SocketBackend(char *inBuf)
* when front-end applications quits/dies * when front-end applications quits/dies
* ------------ * ------------
*/ */
exitpg(0); proc_exit(0);
} }
switch (*qtype) switch (*qtype)
@ -1176,7 +1176,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (errs || argc - optind > 1) if (errs || argc - optind > 1)
{ {
usage(argv[0]); usage(argv[0]);
exitpg(1); proc_exit(1);
} }
else if (argc - optind == 1) else if (argc - optind == 1)
DBName = argv[optind]; DBName = argv[optind];
@ -1184,14 +1184,14 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
{ {
fprintf(stderr, "%s: USER undefined and no database specified\n", fprintf(stderr, "%s: USER undefined and no database specified\n",
argv[0]); argv[0]);
exitpg(1); proc_exit(1);
} }
if (ShowStats && if (ShowStats &&
(ShowParserStats || ShowPlannerStats || ShowExecutorStats)) (ShowParserStats || ShowPlannerStats || ShowExecutorStats))
{ {
fprintf(stderr, "-s can not be used together with -t.\n"); fprintf(stderr, "-s can not be used together with -t.\n");
exitpg(1); proc_exit(1);
} }
if (!DataDir) if (!DataDir)
@ -1201,7 +1201,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
"database system either by specifying the -D invocation " "database system either by specifying the -D invocation "
"option or by setting the PGDATA environment variable.\n\n", "option or by setting the PGDATA environment variable.\n\n",
argv[0]); argv[0]);
exitpg(1); proc_exit(1);
} }
Noversion = flagC; Noversion = flagC;
@ -1325,7 +1325,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster) if (!IsUnderPostmaster)
{ {
puts("\nPOSTGRES backend interactive interface"); puts("\nPOSTGRES backend interactive interface");
puts("$Revision: 1.77 $ $Date: 1998/06/16 07:29:30 $"); puts("$Revision: 1.78 $ $Date: 1998/06/27 04:53:43 $");
} }
/* ---------------- /* ----------------
@ -1335,7 +1335,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
* ---------------- * ----------------
*/ */
if (!TransactionFlushEnabled()) if (!TransactionFlushEnabled())
on_exitpg(FlushBufferPool, NULL); on_shmem_exit(FlushBufferPool, NULL);
for (;;) for (;;)
{ {
@ -1427,7 +1427,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
*/ */
case 'X': case 'X':
pq_close(); pq_close();
exitpg(0); proc_exit(0);
break; break;
default: default:
@ -1458,7 +1458,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
} }
} /* infinite for-loop */ } /* infinite for-loop */
exitpg(0); proc_exit(0);
return 1; return 1;
} }

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.29 1998/06/15 19:29:41 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.30 1998/06/27 04:53:45 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -142,7 +142,7 @@ elog(int lev, const char *fmt,...)
write(open("/dev/console", O_WRONLY, 0666), line, len); write(open("/dev/console", O_WRONLY, 0666), line, len);
fflush(stdout); fflush(stdout);
fflush(stderr); fflush(stderr);
exitpg(lev); proc_exit(lev);
} }
fsync(Err_file); fsync(Err_file);
} }
@ -201,14 +201,14 @@ elog(int lev, const char *fmt,...)
fflush(stderr); fflush(stderr);
ProcReleaseSpins(NULL); /* get rid of spinlocks we hold */ ProcReleaseSpins(NULL); /* get rid of spinlocks we hold */
ProcReleaseLocks(); /* get rid of real locks we hold */ ProcReleaseLocks(); /* get rid of real locks we hold */
exitpg(0); proc_exit(0);
} }
if (lev > FATAL) if (lev > FATAL)
{ {
fflush(stdout); fflush(stdout);
fflush(stderr); fflush(stderr);
exitpg(lev); proc_exit(lev);
} }
} }

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/error/Attic/exc.c,v 1.20 1998/02/26 04:37:35 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/error/Attic/exc.c,v 1.21 1998/06/27 04:53:45 momjian Exp $
* *
* NOTE * NOTE
* XXX this code needs improvement--check for state violations and * XXX this code needs improvement--check for state violations and
@ -78,7 +78,7 @@ EnableExceptionHandling(bool on)
if (on == ExceptionHandlingEnabled) if (on == ExceptionHandlingEnabled)
{ {
/* XXX add logging of failed state */ /* XXX add logging of failed state */
exitpg(255); proc_exit(255);
/* ExitPostgres(FatalExitStatus); */ /* ExitPostgres(FatalExitStatus); */
} }

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.15 1998/05/29 17:00:19 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.16 1998/06/27 04:53:47 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -84,7 +84,7 @@ unsigned char RecodeBackTable[128];
void void
ExitPostgres(ExitStatus status) ExitPostgres(ExitStatus status)
{ {
exitpg(status); proc_exit(status);
} }
/* /*
@ -111,7 +111,7 @@ AbortPostgres()
if (PointerIsValid(abortValue) && abortValue[0] != '\0') if (PointerIsValid(abortValue) && abortValue[0] != '\0')
abort(); abort();
else else
exitpg(FatalExitStatus); proc_exit(FatalExitStatus);
} }
#endif #endif
@ -125,7 +125,7 @@ StatusBackendExit(int status)
{ {
/* someday, do some real cleanup and then call the LISP exit */ /* someday, do some real cleanup and then call the LISP exit */
/* someday, call StatusPostmasterExit if running without postmaster */ /* someday, call StatusPostmasterExit if running without postmaster */
exitpg(status); proc_exit(status);
} }
/* ---------------- /* ----------------
@ -136,7 +136,7 @@ void
StatusPostmasterExit(int status) StatusPostmasterExit(int status)
{ {
/* someday, do some real cleanup and then call the LISP exit */ /* someday, do some real cleanup and then call the LISP exit */
exitpg(status); proc_exit(status);
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.29 1998/06/15 19:29:49 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.30 1998/06/27 04:53:48 momjian Exp $
* *
* NOTES * NOTES
* InitPostgres() is the function called from PostgresMain * InitPostgres() is the function called from PostgresMain
@ -481,7 +481,7 @@ InitPostgres(char *name) /* database name */
InitLocalBuffer(); InitLocalBuffer();
if (!TransactionFlushEnabled()) if (!TransactionFlushEnabled())
on_exitpg(FlushBufferPool, (caddr_t) NULL); on_shmem_exit(FlushBufferPool, (caddr_t) NULL);
/* ---------------- /* ----------------
* initialize the database id used for system caches and lock tables * initialize the database id used for system caches and lock tables
@ -601,7 +601,7 @@ InitPostgres(char *name) /* database name */
* ---------------- * ----------------
*/ */
PostgresIsInitialized = true; PostgresIsInitialized = true;
/* on_exitpg(DestroyLocalRelList, (caddr_t) NULL); */ /* on_shmem_exit(DestroyLocalRelList, (caddr_t) NULL); */
/* ---------------- /* ----------------
* Done with "InitPostgres", now change to NormalProcessing unless * Done with "InitPostgres", now change to NormalProcessing unless

View File

@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: ipc.h,v 1.26 1998/06/23 15:35:48 momjian Exp $ * $Id: ipc.h,v 1.27 1998/06/27 04:53:49 momjian Exp $
* *
* NOTES * NOTES
* This file is very architecture-specific. This stuff should actually * This file is very architecture-specific. This stuff should actually
@ -71,10 +71,11 @@ typedef int IpcMemoryId;
/* ipc.c */ /* ipc.c */
extern void exitpg(int code); extern void proc_exit(int code);
extern void quasi_exitpg(void); extern void shmem_exit(int code);
extern int on_exitpg(void (*function) (), caddr_t arg); extern int on_shmem_exit(void (*function) (), caddr_t arg);
extern void clear_exitpg(void); extern int on_proc_exit(void (*function) (), caddr_t arg);
extern void clear_proc_exit(void);
extern IpcSemaphoreId extern IpcSemaphoreId
IpcSemaphoreCreate(IpcSemaphoreKey semKey, IpcSemaphoreCreate(IpcSemaphoreKey semKey,