| /*------------------------------------------------------------------------- |
| * |
| * 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-2009, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * $PostgreSQL: pgsql/src/include/storage/pg_sema.h,v 1.10 2006/10/04 00:30:10 momjian 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 |
| |
| #ifdef USE_WIN32_SEMAPHORES |
| |
| typedef HANDLE 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 */ |
| extern void PGSemaphoreCreateInitVal(PGSemaphore sema, int initval); |
| /* Initialize a PGSemaphore structure to represent a sema with count 1 */ |
| static inline void PGSemaphoreCreate(PGSemaphore sema) |
| { |
| PGSemaphoreCreateInitVal(sema, 1); |
| } |
| |
| /* 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); |
| |
| /* |
| * Lock a semaphore (decrement count), blocking if count would be < 0. |
| * Return true if the lock obtained or false if an interrupt occurred. |
| */ |
| extern bool PGSemaphoreLockInterruptable(PGSemaphore sema); |
| |
| /* 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 */ |