shmem_exit to replace exitpg().
* 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 $
*
*-------------------------------------------------------------------------
*/
fprintf(stderr, " O: set BootstrapProcessing mode\n");
fprintf(stderr, " P portno: specify port number\n");
- exitpg(1);
+ proc_exit(1);
}
"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)
{
fputs("bootstrap backend: failed, no db name specified\n", stderr);
fputs(" and no USER enviroment variable\n", stderr);
- exitpg(1);
+ proc_exit(1);
}
}
if (IsUnderPostmaster && portFd < 0)
{
fputs("backend: failed, no -P option with -postmaster opt.\n", stderr);
- exitpg(1);
+ proc_exit(1);
}
/* ----------------
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);
}
/* ----------------
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
*/
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);
}
/*
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
}
if (family == AF_UNIX)
- on_exitpg(StreamDoUnlink, NULL);
+ on_proc_exit(StreamDoUnlink, NULL);
listen(fd, SOMAXCONN);
*
*
* 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
*
static void
pmdie(SIGNAL_ARGS)
{
- exitpg(0);
+ proc_exit(0);
}
/*
{
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.
}
/*
- * 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
if (DebugLvl)
fprintf(stderr, "%s: CleanupProc: reinitializing shared memory and semaphores\n",
progname);
- quasi_exitpg();
+ shmem_exit();
reset_shared(PostPortName);
}
}
* 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.
StreamClose(ServerSock_INET);
if (ServerSock_UNIX != INVALID_SOCK)
StreamClose(ServerSock_UNIX);
- exitpg(status);
+ proc_exit(status);
}
static void
*
*
* 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
*
{
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
/* ----------------------------------------------------------------
- * exitpg
+ * proc_exit
*
* this function calls all the callbacks registered
* for it (to free resources) and then calls exit.
* -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);
+
+ on_shmem_exit_index = 0;
+ shmem_exit_inprogress = 0;
+}
- onexit_index = 0;
- exitpg_inprogress = 0;
+/* ----------------------------------------------------------------
+ * on_proc_exit
+ *
+ * this function adds a callback function to the list of
+ * functions invoked by proc_exit(). -cim 2/6/90
+ * ----------------------------------------------------------------
+ */
+int
+on_proc_exit(void (*function) (), caddr_t arg)
+{
+ if (on_proc_exit_index >= MAX_ON_EXITS)
+ return (-1);
+
+ on_proc_exit_list[on_proc_exit_index].function = function;
+ on_proc_exit_list[on_proc_exit_index].arg = arg;
+
+ ++on_proc_exit_index;
+
+ return (0);
}
/* ----------------------------------------------------------------
- * on_exitpg
+ * on_shmem_exit
*
* this function adds a callback function to the list of
- * functions invoked by exitpg(). -cim 2/6/90
+ * functions invoked by shmem_exit(). -cim 2/6/90
* ----------------------------------------------------------------
*/
int
-on_exitpg(void (*function) (), caddr_t arg)
+on_shmem_exit(void (*function) (), caddr_t arg)
{
- if (onexit_index >= MAX_ON_EXITS)
+ if (on_shmem_exit_index >= MAX_ON_EXITS)
return (-1);
- onexit_list[onexit_index].function = function;
- onexit_list[onexit_index].arg = arg;
+ on_shmem_exit_list[on_shmem_exit_index].function = function;
+ on_shmem_exit_list[on_shmem_exit_index].arg = arg;
- ++onexit_index;
+ ++on_shmem_exit_index;
return (0);
}
/* ----------------------------------------------------------------
- * clear_exitpg
+ * clear_proc_exit
*
- * this function clears all exitpg() registered functions.
+ * this function clears all proc_exit() registered functions.
* ----------------------------------------------------------------
*/
void
-clear_exitpg(void)
+clear_proc_exit(void)
{
- onexit_index = 0;
+ on_proc_exit_index = 0;
}
/****************************************************************************/
{
perror("semget");
IpcConfigTip();
- exitpg(3);
+ proc_exit(3);
}
for (i = 0; i < semNum; i++)
array[i] = semStartValue;
}
if (removeOnExit)
- on_exitpg(IPCPrivateSemaphoreKill, (caddr_t) semId);
+ on_shmem_exit(IPCPrivateSemaphoreKill, (caddr_t) semId);
}
else
{
perror("semop");
IpcConfigTip();
- exitpg(255);
+ proc_exit(255);
}
}
{
perror("semop");
IpcConfigTip();
- exitpg(255);
+ proc_exit(255);
}
}
}
/* if (memKey == PrivateIPCKey) */
- on_exitpg(IPCPrivateMemoryKill, (caddr_t) shmid);
+ on_shmem_exit(IPCPrivateMemoryKill, (caddr_t) shmid);
return (shmid);
}
}
if (!UsePrivateMemory)
- on_exitpg(IpcMemoryDetach, (caddr_t) memAddress);
+ on_shmem_exit(IpcMemoryDetach, (caddr_t) memAddress);
return ((char *) memAddress);
}
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
* ----------------
*/
InitLocks();
- InitMultiLevelLocks();
if (InitMultiLevelLocks() == INVALID_TABLEID)
elog(FATAL, "Couldn't create the lock table");
* ----------------
*/
InitProcGlobal(key);
- on_exitpg(ProcFreeAllSemaphores, NULL);
+ on_shmem_exit(ProcFreeAllSemaphores, NULL);
CreateSharedInvalidationState(key);
}
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
}
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);
}
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
#endif /* INVALIDDEBUG */
SISetActiveProcess(segInOutP, MyBackendId);
- on_exitpg(CleanupInvalidationState, (caddr_t) segInOutP);
+ on_shmem_exit(CleanupInvalidationState, (caddr_t) segInOutP);
return 1;
}
* 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 */
*
*
* 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
* no zero-th table
* -------------------
*/
-static int NumTables = 1;
+static int NumTables;
/* -------------------
* InitLocks -- Init the lock module. Create a private data
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)
status = FALSE;
}
+ NumTables = 1;
+
/* ----------------
* we're first - initialize
* ----------------
*
*
* 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
{
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))
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
* 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 <sys/time.h>
#include <unistd.h>
MyProc->errType = NO_ERROR;
SHMQueueElemInit(&(MyProc->links));
- on_exitpg(ProcKill, (caddr_t) MyProcPid);
+ on_shmem_exit(ProcKill, (caddr_t) MyProcPid);
ProcInitialized = TRUE;
}
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
}
/* register the shutdown proc */
- on_exitpg(smgrshutdown, NULL);
+ on_proc_exit(smgrshutdown, NULL);
return (SM_SUCCESS);
}
*
*
* 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
if (!Quiet)
puts("EOF");
IsEmptyQuery = true;
- exitpg(0);
+ proc_exit(0);
}
/* ----------------
* when front-end applications quits/dies
* ------------
*/
- exitpg(0);
+ proc_exit(0);
}
switch (*qtype)
if (errs || argc - optind > 1)
{
usage(argv[0]);
- exitpg(1);
+ proc_exit(1);
}
else if (argc - optind == 1)
DBName = argv[optind];
{
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)
"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;
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 $");
}
/* ----------------
* ----------------
*/
if (!TransactionFlushEnabled())
- on_exitpg(FlushBufferPool, NULL);
+ on_shmem_exit(FlushBufferPool, NULL);
for (;;)
{
*/
case 'X':
pq_close();
- exitpg(0);
+ proc_exit(0);
break;
default:
}
} /* infinite for-loop */
- exitpg(0);
+ proc_exit(0);
return 1;
}
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
write(open("/dev/console", O_WRONLY, 0666), line, len);
fflush(stdout);
fflush(stderr);
- exitpg(lev);
+ proc_exit(lev);
}
fsync(Err_file);
}
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);
}
}
*
*
* 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
if (on == ExceptionHandlingEnabled)
{
/* XXX add logging of failed state */
- exitpg(255);
+ proc_exit(255);
/* ExitPostgres(FatalExitStatus); */
}
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
void
ExitPostgres(ExitStatus status)
{
- exitpg(status);
+ proc_exit(status);
}
/*
if (PointerIsValid(abortValue) && abortValue[0] != '\0')
abort();
else
- exitpg(FatalExitStatus);
+ proc_exit(FatalExitStatus);
}
#endif
{
/* someday, do some real cleanup and then call the LISP exit */
/* someday, call StatusPostmasterExit if running without postmaster */
- exitpg(status);
+ proc_exit(status);
}
/* ----------------
StatusPostmasterExit(int status)
{
/* someday, do some real cleanup and then call the LISP exit */
- exitpg(status);
+ proc_exit(status);
}
/* ----------------------------------------------------------------
*
*
* 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
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
* ----------------
*/
PostgresIsInitialized = true;
-/* on_exitpg(DestroyLocalRelList, (caddr_t) NULL); */
+/* on_shmem_exit(DestroyLocalRelList, (caddr_t) NULL); */
/* ----------------
* Done with "InitPostgres", now change to NormalProcessing unless
*
* 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
/* 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,