From e747c5871855434570c7d3710b391b863d90f03a Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 27 Jun 1998 04:53:49 +0000 Subject: [PATCH] Fix for hang after postmaster restart. Add new proc_exit and shmem_exit to replace exitpg(). --- src/backend/bootstrap/bootstrap.c | 14 ++-- src/backend/commands/async.c | 4 +- src/backend/libpq/pqcomm.c | 4 +- src/backend/postmaster/postmaster.c | 20 +++--- src/backend/storage/ipc/ipc.c | 102 +++++++++++++++++----------- src/backend/storage/ipc/ipci.c | 5 +- src/backend/storage/ipc/shmem.c | 4 +- src/backend/storage/ipc/sinvaladt.c | 6 +- src/backend/storage/lmgr/lock.c | 14 ++-- src/backend/storage/lmgr/multi.c | 9 +-- src/backend/storage/lmgr/proc.c | 6 +- src/backend/storage/smgr/smgr.c | 4 +- src/backend/tcop/postgres.c | 22 +++--- src/backend/utils/error/elog.c | 8 +-- src/backend/utils/error/exc.c | 4 +- src/backend/utils/init/miscinit.c | 10 +-- src/backend/utils/init/postinit.c | 6 +- src/include/storage/ipc.h | 11 +-- 18 files changed, 130 insertions(+), 123 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 85afd78746..acf461d162 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -7,7 +7,7 @@ * Copyright (c) 1994, Regents of the University of California * * 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, " 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 " "option or by setting the PGDATA environment variable.\n\n", argv[0]); - exitpg(1); + proc_exit(1); } if (dbName == NULL) @@ -370,7 +370,7 @@ BootstrapMain(int argc, char *argv[]) { fputs("bootstrap backend: failed, no db name specified\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) { fputs("backend: failed, no -P option with -postmaster opt.\n", stderr); - exitpg(1); + proc_exit(1); } /* ---------------- @@ -770,12 +770,12 @@ cleanup() else { elog(FATAL, "Memory manager fault: cleanup called twice.\n", stderr); - exitpg(1); + proc_exit(1); } if (reldesc != (Relation) NULL) heap_close(reldesc); CommitTransactionCommand(); - exitpg(Warnings); + proc_exit(Warnings); } /* ---------------- diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index fcdda33305..b4b354cfc5 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -7,7 +7,7 @@ * * * 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 */ StrNCpy(relnamei, relname, NAMEDATALEN); - on_exitpg(Async_UnlistenOnExit, (caddr_t) relnamei); + on_shmem_exit(Async_UnlistenOnExit, (caddr_t) relnamei); } /* diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 710fe8184b..a70bbc22e9 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -7,7 +7,7 @@ * * * 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) - on_exitpg(StreamDoUnlink, NULL); + on_proc_exit(StreamDoUnlink, NULL); listen(fd, SOMAXCONN); diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 5c44655910..941d8ed119 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -10,7 +10,7 @@ * * * 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 * @@ -895,7 +895,7 @@ reset_shared(short port) static void pmdie(SIGNAL_ARGS) { - exitpg(0); + proc_exit(0); } /* @@ -986,9 +986,9 @@ CleanupProc(int pid, { bp = (Backend *) DLE_VAL(curr); - /* - * ----------------- SIGUSR1 is the special signal that sez exit - * without exitpg and let the user know what's going on. + /* ----------------- + * SIGUSR1 is the special signal that says exit + * without proc_exit and let the user know what's going on. * ProcSemaphoreKill() cleans up the backends semaphore. If * SendStop is set (-s on command line), then we send a SIGSTOP so * 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 * time we recreated shared memory and sems another frontend has * requested and received a connection and I have forked off another @@ -1036,7 +1032,7 @@ CleanupProc(int pid, if (DebugLvl) fprintf(stderr, "%s: CleanupProc: reinitializing shared memory and semaphores\n", progname); - quasi_exitpg(); + shmem_exit(); reset_shared(PostPortName); } } @@ -1230,7 +1226,7 @@ DoBackend(Port *port) * 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. @@ -1352,7 +1348,7 @@ ExitPostmaster(int status) StreamClose(ServerSock_INET); if (ServerSock_UNIX != INVALID_SOCK) StreamClose(ServerSock_UNIX); - exitpg(status); + proc_exit(status); } static void diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c index d301cdfe00..e1ef1119ef 100644 --- a/src/backend/storage/ipc/ipc.c +++ b/src/backend/storage/ipc/ipc.c @@ -7,7 +7,7 @@ * * * 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 * @@ -60,9 +60,9 @@ static struct ONEXIT { void (*function) (); 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); typedef struct _PrivateMemStruct @@ -98,7 +98,7 @@ PrivateMemoryAttach(IpcMemoryId memid) /* ---------------------------------------------------------------- - * exitpg + * proc_exit * * this function calls all the callbacks registered * for it (to free resources) and then calls exit. @@ -106,100 +106,124 @@ PrivateMemoryAttach(IpcMemoryId memid) * -cim 2/6/90 * ---------------------------------------------------------------- */ -static int exitpg_inprogress = 0; +static int proc_exit_inprogress = 0; void -exitpg(int code) +proc_exit(int code) { 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 * and so we return immediately to avoid recursion. * ---------------- */ - if (exitpg_inprogress) + if (proc_exit_inprogress) 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(). * ---------------- */ - for (i = onexit_index - 1; i >= 0; --i) - (*onexit_list[i].function) (code, onexit_list[i].arg); + for (i = on_proc_exit_index - 1; i >= 0; --i) + (*on_proc_exit_list[i].function) (code, on_proc_exit_list[i].arg); 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 * semaphores after a backend dies horribly * ------------------ */ +static int shmem_exit_inprogress = 0; + void -quasi_exitpg() +shmem_exit(int code) { 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 * and so we return immediately to avoid recursion. * ---------------- */ - if (exitpg_inprogress) + if (shmem_exit_inprogress) return; - exitpg_inprogress = 1; + shmem_exit_inprogress = 1; /* ---------------- * call all the callbacks registered before calling exit(). * ---------------- */ - for (i = onexit_index - 1; i >= 0; --i) - /* Don't do StreamDoUnlink on quasi_exit */ - if (onexit_list[i].function != StreamDoUnlink) - (*onexit_list[i].function) (0, onexit_list[i].arg); + for (i = on_shmem_exit_index - 1; i >= 0; --i) + (*on_shmem_exit_list[i].function) (code, on_shmem_exit_list[i].arg); - onexit_index = 0; - exitpg_inprogress = 0; + on_shmem_exit_index = 0; + shmem_exit_inprogress = 0; } /* ---------------------------------------------------------------- - * on_exitpg + * on_proc_exit * * 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 -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); - onexit_list[onexit_index].function = function; - onexit_list[onexit_index].arg = arg; + on_proc_exit_list[on_proc_exit_index].function = function; + on_proc_exit_list[on_proc_exit_index].arg = arg; - ++onexit_index; + ++on_proc_exit_index; 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 -clear_exitpg(void) +clear_proc_exit(void) { - onexit_index = 0; + on_proc_exit_index = 0; } /****************************************************************************/ @@ -301,7 +325,7 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey, { perror("semget"); IpcConfigTip(); - exitpg(3); + proc_exit(3); } for (i = 0; i < semNum; i++) array[i] = semStartValue; @@ -314,7 +338,7 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey, } if (removeOnExit) - on_exitpg(IPCPrivateSemaphoreKill, (caddr_t) semId); + on_shmem_exit(IPCPrivateSemaphoreKill, (caddr_t) semId); } else @@ -418,7 +442,7 @@ IpcSemaphoreLock(IpcSemaphoreId semId, int sem, int lock) { perror("semop"); IpcConfigTip(); - exitpg(255); + proc_exit(255); } } @@ -463,7 +487,7 @@ IpcSemaphoreUnlock(IpcSemaphoreId semId, int sem, int lock) { perror("semop"); IpcConfigTip(); - exitpg(255); + proc_exit(255); } } @@ -517,7 +541,7 @@ IpcMemoryCreate(IpcMemoryKey memKey, uint32 size, int permission) } /* if (memKey == PrivateIPCKey) */ - on_exitpg(IPCPrivateMemoryKill, (caddr_t) shmid); + on_shmem_exit(IPCPrivateMemoryKill, (caddr_t) shmid); return (shmid); } @@ -583,7 +607,7 @@ IpcMemoryAttach(IpcMemoryId memId) } if (!UsePrivateMemory) - on_exitpg(IpcMemoryDetach, (caddr_t) memAddress); + on_shmem_exit(IpcMemoryDetach, (caddr_t) memAddress); return ((char *) memAddress); } diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index e8aabe5a74..4bcc15efd2 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -7,7 +7,7 @@ * * * 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(); - InitMultiLevelLocks(); if (InitMultiLevelLocks() == INVALID_TABLEID) elog(FATAL, "Couldn't create the lock table"); @@ -101,7 +100,7 @@ CreateSharedMemoryAndSemaphores(IPCKey key) * ---------------- */ InitProcGlobal(key); - on_exitpg(ProcFreeAllSemaphores, NULL); + on_shmem_exit(ProcFreeAllSemaphores, NULL); CreateSharedInvalidationState(key); } diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index 431edc6ff7..6bf0a500a3 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -7,7 +7,7 @@ * * * 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 { - /* look it up in the bindint table */ + /* look it up in the binding table */ result = (BindingEnt *) hash_search(BindingTable, (char *) &item, HASH_ENTER, foundPtr); } diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index bca6dcee16..b54f4dc221 100644 --- a/src/backend/storage/ipc/sinvaladt.c +++ b/src/backend/storage/ipc/sinvaladt.c @@ -7,7 +7,7 @@ * * * 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 */ SISetActiveProcess(segInOutP, MyBackendId); - on_exitpg(CleanupInvalidationState, (caddr_t) segInOutP); + on_shmem_exit(CleanupInvalidationState, (caddr_t) segInOutP); return 1; } @@ -193,7 +193,7 @@ SISetDeadProcess(SISeg *segP, int backendId) * CleanupInvalidationState -- * Note: * This is a temporary hack. ExitBackend should call this instead - * of exit (via on_exitpg). + * of exit (via on_shmem_exit). */ static void CleanupInvalidationState(int status, /* XXX */ diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index ab8b7b8258..191ee71f87 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -7,7 +7,7 @@ * * * 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 * Outside modules can create a lock table and acquire/release @@ -153,7 +153,7 @@ static LOCKTAB *AllTables[MAX_TABLES]; * no zero-th table * ------------------- */ -static int NumTables = 1; +static int NumTables; /* ------------------- * InitLocks -- Init the lock module. Create a private data @@ -242,14 +242,6 @@ LockTableInit(char *tabName, 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 */ shmemName = (char *) palloc((unsigned) (strlen(tabName) + 32)); if (!shmemName) @@ -289,6 +281,8 @@ LockTableInit(char *tabName, status = FALSE; } + NumTables = 1; + /* ---------------- * we're first - initialize * ---------------- diff --git a/src/backend/storage/lmgr/multi.c b/src/backend/storage/lmgr/multi.c index 135996432a..19682ffe95 100644 --- a/src/backend/storage/lmgr/multi.c +++ b/src/backend/storage/lmgr/multi.c @@ -12,7 +12,7 @@ * * * 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: * (1) The lock.c module assumes that the caller here is doing @@ -89,13 +89,6 @@ InitMultiLevelLocks() { int tableId; - /* ----------------------- - * If we're already initialized just return the table id. - * ----------------------- - */ - if (MultiTableId) - return MultiTableId; - tableId = LockTableInit("LockTable", MultiConflicts, MultiPrios, 5); MultiTableId = tableId; if (!(MultiTableId)) diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index d6ef6f9e7a..559542ed8a 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -7,7 +7,7 @@ * * * 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 * 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 #include @@ -274,7 +274,7 @@ InitProcess(IPCKey key) MyProc->errType = NO_ERROR; SHMQueueElemInit(&(MyProc->links)); - on_exitpg(ProcKill, (caddr_t) MyProcPid); + on_shmem_exit(ProcKill, (caddr_t) MyProcPid); ProcInitialized = TRUE; } diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 4960eebe16..f96e7aa098 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -10,7 +10,7 @@ * * * 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 */ - on_exitpg(smgrshutdown, NULL); + on_proc_exit(smgrshutdown, NULL); return (SM_SUCCESS); } diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 2c457bf05e..97ac571d2c 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -7,7 +7,7 @@ * * * 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 * this is the "main" module of the postgres backend and @@ -263,7 +263,7 @@ InteractiveBackend(char *inBuf) if (!Quiet) puts("EOF"); IsEmptyQuery = true; - exitpg(0); + proc_exit(0); } /* ---------------- @@ -312,7 +312,7 @@ SocketBackend(char *inBuf) * when front-end applications quits/dies * ------------ */ - exitpg(0); + proc_exit(0); } switch (*qtype) @@ -1176,7 +1176,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) if (errs || argc - optind > 1) { usage(argv[0]); - exitpg(1); + proc_exit(1); } else if (argc - optind == 1) 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", argv[0]); - exitpg(1); + proc_exit(1); } if (ShowStats && (ShowParserStats || ShowPlannerStats || ShowExecutorStats)) { fprintf(stderr, "-s can not be used together with -t.\n"); - exitpg(1); + proc_exit(1); } 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 " "option or by setting the PGDATA environment variable.\n\n", argv[0]); - exitpg(1); + proc_exit(1); } Noversion = flagC; @@ -1325,7 +1325,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) if (!IsUnderPostmaster) { 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()) - on_exitpg(FlushBufferPool, NULL); + on_shmem_exit(FlushBufferPool, NULL); for (;;) { @@ -1427,7 +1427,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) */ case 'X': pq_close(); - exitpg(0); + proc_exit(0); break; default: @@ -1458,7 +1458,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) } } /* infinite for-loop */ - exitpg(0); + proc_exit(0); return 1; } diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 88ca05a1b2..04fd4d0c03 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -7,7 +7,7 @@ * * * 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); fflush(stdout); fflush(stderr); - exitpg(lev); + proc_exit(lev); } fsync(Err_file); } @@ -201,14 +201,14 @@ elog(int lev, const char *fmt,...) fflush(stderr); ProcReleaseSpins(NULL); /* get rid of spinlocks we hold */ ProcReleaseLocks(); /* get rid of real locks we hold */ - exitpg(0); + proc_exit(0); } if (lev > FATAL) { fflush(stdout); fflush(stderr); - exitpg(lev); + proc_exit(lev); } } diff --git a/src/backend/utils/error/exc.c b/src/backend/utils/error/exc.c index ee79fa9814..70af54af12 100644 --- a/src/backend/utils/error/exc.c +++ b/src/backend/utils/error/exc.c @@ -7,7 +7,7 @@ * * * 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 * XXX this code needs improvement--check for state violations and @@ -78,7 +78,7 @@ EnableExceptionHandling(bool on) if (on == ExceptionHandlingEnabled) { /* XXX add logging of failed state */ - exitpg(255); + proc_exit(255); /* ExitPostgres(FatalExitStatus); */ } diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 7f02bec611..da0f412fea 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -7,7 +7,7 @@ * * * 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 ExitPostgres(ExitStatus status) { - exitpg(status); + proc_exit(status); } /* @@ -111,7 +111,7 @@ AbortPostgres() if (PointerIsValid(abortValue) && abortValue[0] != '\0') abort(); else - exitpg(FatalExitStatus); + proc_exit(FatalExitStatus); } #endif @@ -125,7 +125,7 @@ StatusBackendExit(int status) { /* someday, do some real cleanup and then call the LISP exit */ /* someday, call StatusPostmasterExit if running without postmaster */ - exitpg(status); + proc_exit(status); } /* ---------------- @@ -136,7 +136,7 @@ void StatusPostmasterExit(int status) { /* someday, do some real cleanup and then call the LISP exit */ - exitpg(status); + proc_exit(status); } /* ---------------------------------------------------------------- diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 650068d22d..36de317266 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -7,7 +7,7 @@ * * * 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 * InitPostgres() is the function called from PostgresMain @@ -481,7 +481,7 @@ InitPostgres(char *name) /* database name */ InitLocalBuffer(); 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 @@ -601,7 +601,7 @@ InitPostgres(char *name) /* database name */ * ---------------- */ PostgresIsInitialized = true; -/* on_exitpg(DestroyLocalRelList, (caddr_t) NULL); */ +/* on_shmem_exit(DestroyLocalRelList, (caddr_t) NULL); */ /* ---------------- * Done with "InitPostgres", now change to NormalProcessing unless diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h index 1327b2d170..778c54e207 100644 --- a/src/include/storage/ipc.h +++ b/src/include/storage/ipc.h @@ -6,7 +6,7 @@ * * 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 * This file is very architecture-specific. This stuff should actually @@ -71,10 +71,11 @@ typedef int IpcMemoryId; /* ipc.c */ -extern void exitpg(int code); -extern void quasi_exitpg(void); -extern int on_exitpg(void (*function) (), caddr_t arg); -extern void clear_exitpg(void); +extern void proc_exit(int code); +extern void shmem_exit(int code); +extern int on_shmem_exit(void (*function) (), caddr_t arg); +extern int on_proc_exit(void (*function) (), caddr_t arg); +extern void clear_proc_exit(void); extern IpcSemaphoreId IpcSemaphoreCreate(IpcSemaphoreKey semKey,