mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
Fix for hang after postmaster restart. Add new proc_exit and
shmem_exit to replace exitpg().
This commit is contained in:
parent
8fa93b016a
commit
e747c58718
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
* ----------------
|
* ----------------
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user