diff options
Diffstat (limited to 'src/include/storage/pg_sema.h')
-rw-r--r-- | src/include/storage/pg_sema.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/include/storage/pg_sema.h b/src/include/storage/pg_sema.h new file mode 100644 index 00000000000..65c1936c29f --- /dev/null +++ b/src/include/storage/pg_sema.h @@ -0,0 +1,76 @@ +/*------------------------------------------------------------------------- + * + * pg_sema.h + * Platform-independent API for semaphores. + * + * PostgreSQL requires counting semaphores (the kind that keep track of + * multiple unlock operations, and will allow an equal number of subsequent + * lock operations before blocking). The underlying implementation is + * not the same on every platform. This file defines the API that must + * be provided by each port. + * + * + * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $Id: pg_sema.h,v 1.1 2002/05/05 00:03:29 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef PG_SEMA_H +#define PG_SEMA_H + +/* + * PGSemaphoreData and pointer type PGSemaphore are the data structure + * representing an individual semaphore. The contents of PGSemaphoreData + * vary across implementations and must never be touched by platform- + * independent code. PGSemaphoreData structures are always allocated + * in shared memory (to support implementations where the data changes during + * lock/unlock). + * + * pg_config.h must define exactly one of the USE_xxx_SEMAPHORES symbols. + */ + +#ifdef USE_NAMED_POSIX_SEMAPHORES + +#include <semaphore.h> + +typedef sem_t *PGSemaphoreData; + +#endif + +#ifdef USE_UNNAMED_POSIX_SEMAPHORES + +#include <semaphore.h> + +typedef sem_t PGSemaphoreData; + +#endif + +#ifdef USE_SYSV_SEMAPHORES + +typedef struct PGSemaphoreData +{ + int semId; /* semaphore set identifier */ + int semNum; /* semaphore number within set */ +} PGSemaphoreData; + +#endif + +typedef PGSemaphoreData *PGSemaphore; + + +/* Module initialization (called during postmaster start or shmem reinit) */ +extern void PGReserveSemaphores(int maxSemas, int port); +/* Initialize a PGSemaphore structure to represent a sema with count 1 */ +extern void PGSemaphoreCreate(PGSemaphore sema); +/* Reset a previously-initialized PGSemaphore to have count 0 */ +extern void PGSemaphoreReset(PGSemaphore sema); +/* Lock a semaphore (decrement count), blocking if count would be < 0 */ +extern void PGSemaphoreLock(PGSemaphore sema, bool interruptOK); +/* Unlock a semaphore (increment count) */ +extern void PGSemaphoreUnlock(PGSemaphore sema); +/* Lock a semaphore only if able to do so without blocking */ +extern bool PGSemaphoreTryLock(PGSemaphore sema); + +#endif /* PG_SEMA_H */ |