diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-11-28 23:27:57 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-11-28 23:27:57 +0000 |
commit | c715fdea267843fd7fae4253aee0ae91e941393c (patch) | |
tree | b19e41edd57afe461ebc3dae271c8a5d17eba710 /src/include/storage/proc.h | |
parent | 914822713c9a8ce452860fb895ef79ecfd583746 (diff) | |
download | postgresql-c715fdea267843fd7fae4253aee0ae91e941393c.tar.gz postgresql-c715fdea267843fd7fae4253aee0ae91e941393c.zip |
Significant cleanups in SysV IPC handling (shared mem and semaphores).
IPC key assignment will now work correctly even when multiple postmasters
are using same logical port number (which is possible given -k switch).
There is only one shared-mem segment per postmaster now, not 3.
Rip out broken code for non-TAS case in bufmgr and xlog, substitute a
complete S_LOCK emulation using semaphores in spin.c. TAS and non-TAS
logic is now exactly the same.
When deadlock is detected, "Deadlock detected" is now the elog(ERROR)
message, rather than a NOTICE that comes out before an unhelpful ERROR.
Diffstat (limited to 'src/include/storage/proc.h')
-rw-r--r-- | src/include/storage/proc.h | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index edc6359fc43..41305d80831 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -1,13 +1,13 @@ /*------------------------------------------------------------------------- * * proc.h - * + * per-process shared memory data structures * * * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: proc.h,v 1.31 2000/05/31 00:28:38 petere Exp $ + * $Id: proc.h,v 1.32 2000/11/28 23:27:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,9 +23,8 @@ extern int DeadlockTimeout; typedef struct { int sleeplock; - int semNum; IpcSemaphoreId semId; - IpcSemaphoreKey semKey; + int semNum; } SEMA; /* @@ -33,7 +32,6 @@ typedef struct */ typedef struct proc { - /* proc->links MUST BE THE FIRST ELEMENT OF STRUCT (see ProcWakeup()) */ SHM_QUEUE links; /* proc can be waiting for one event(lock) */ @@ -63,34 +61,6 @@ typedef struct proc * transaction */ } PROC; - -/* - * PROC_NSEMS_PER_SET is the number of semaphores in each sys-V semaphore set - * we allocate. It must be *less than* 32 (or however many bits in an int - * on your machine), or our free-semaphores bitmap won't work. You also must - * not set it higher than your kernel's SEMMSL (max semaphores per set) - * parameter, which is often around 25. - * - * MAX_PROC_SEMS is the maximum number of per-process semaphores (those used - * by the lock mgr) we can keep track of. It must be a multiple of - * PROC_NSEMS_PER_SET. - */ -#define PROC_NSEMS_PER_SET 16 -#define MAX_PROC_SEMS (((MAXBACKENDS-1)/PROC_NSEMS_PER_SET+1)*PROC_NSEMS_PER_SET) - -typedef struct procglobal -{ - SHMEM_OFFSET freeProcs; - IPCKey currKey; - int32 freeSemMap[MAX_PROC_SEMS / PROC_NSEMS_PER_SET]; - - /* - * In each freeSemMap entry, the PROC_NSEMS_PER_SET least-significant - * bits flag whether individual semaphores are in use, and the next - * higher bit is set to show that the entire set is allocated. - */ -} PROC_HDR; - extern PROC *MyProc; #define PROC_INCR_SLOCK(lock) \ @@ -115,16 +85,46 @@ do { \ extern SPINLOCK ProcStructLock; + +/* + * There is one ProcGlobal struct for the whole installation. + * + * PROC_NSEMS_PER_SET is the number of semaphores in each sys-V semaphore set + * we allocate. It must be no more than 32 (or however many bits in an int + * on your machine), or our free-semaphores bitmap won't work. It also must + * be *less than* your kernel's SEMMSL (max semaphores per set) parameter, + * which is often around 25. (Less than, because we allocate one extra sema + * in each set for identification purposes.) + * + * PROC_SEM_MAP_ENTRIES is the number of semaphore sets we need to allocate + * to keep track of up to MAXBACKENDS backends. + */ +#define PROC_NSEMS_PER_SET 16 +#define PROC_SEM_MAP_ENTRIES ((MAXBACKENDS-1)/PROC_NSEMS_PER_SET+1) + +typedef struct procglobal +{ + /* Head of list of free PROC structures */ + SHMEM_OFFSET freeProcs; + + /* Info about semaphore sets used for per-process semaphores */ + IpcSemaphoreId procSemIds[PROC_SEM_MAP_ENTRIES]; + int32 freeSemMap[PROC_SEM_MAP_ENTRIES]; + + /* + * In each freeSemMap entry, bit i is set if the i'th semaphore of the + * set is allocated to a process. (i counts from 0 at the LSB) + */ +} PROC_HDR; + /* * Function Prototypes */ -extern void InitProcess(IPCKey key); +extern void InitProcGlobal(int maxBackends); +extern void InitProcess(void); extern void ProcReleaseLocks(void); extern bool ProcRemove(int pid); -/* extern bool ProcKill(int exitStatus, int pid); */ -/* make static in storage/lmgr/proc.c -- jolly */ - extern void ProcQueueInit(PROC_QUEUE *queue); extern int ProcSleep(PROC_QUEUE *queue, LOCKMETHODCTL *lockctl, int token, LOCK *lock); |