| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * pg_sema.h |
| 4 | * Platform-independent API for semaphores. |
| 5 | * |
| 6 | * PostgreSQL requires counting semaphores (the kind that keep track of |
| 7 | * multiple unlock operations, and will allow an equal number of subsequent |
| 8 | * lock operations before blocking). The underlying implementation is |
| 9 | * not the same on every platform. This file defines the API that must |
| 10 | * be provided by each port. |
| 11 | * |
| 12 | * |
| 13 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 14 | * Portions Copyright (c) 1994, Regents of the University of California |
| 15 | * |
| 16 | * src/include/storage/pg_sema.h |
| 17 | * |
| 18 | *------------------------------------------------------------------------- |
| 19 | */ |
| 20 | #ifndef PG_SEMA_H |
| 21 | #define PG_SEMA_H |
| 22 | |
| 23 | /* |
| 24 | * struct PGSemaphoreData and pointer type PGSemaphore are the data structure |
| 25 | * representing an individual semaphore. The contents of PGSemaphoreData vary |
| 26 | * across implementations and must never be touched by platform-independent |
| 27 | * code; hence, PGSemaphoreData is declared as an opaque struct here. |
| 28 | * |
| 29 | * However, Windows is sufficiently unlike our other ports that it doesn't |
| 30 | * seem worth insisting on ABI compatibility for Windows too. Hence, on |
| 31 | * that platform just define PGSemaphore as HANDLE. |
| 32 | */ |
| 33 | #ifndef USE_WIN32_SEMAPHORES |
| 34 | typedef struct PGSemaphoreData *PGSemaphore; |
| 35 | #else |
| 36 | typedef HANDLE PGSemaphore; |
| 37 | #endif |
| 38 | |
| 39 | |
| 40 | /* Report amount of shared memory needed */ |
| 41 | extern Size PGSemaphoreShmemSize(int maxSemas); |
| 42 | |
| 43 | /* Module initialization (called during postmaster start or shmem reinit) */ |
| 44 | extern void PGReserveSemaphores(int maxSemas, int port); |
| 45 | |
| 46 | /* Allocate a PGSemaphore structure with initial count 1 */ |
| 47 | extern PGSemaphore PGSemaphoreCreate(void); |
| 48 | |
| 49 | /* Reset a previously-initialized PGSemaphore to have count 0 */ |
| 50 | extern void PGSemaphoreReset(PGSemaphore sema); |
| 51 | |
| 52 | /* Lock a semaphore (decrement count), blocking if count would be < 0 */ |
| 53 | extern void PGSemaphoreLock(PGSemaphore sema); |
| 54 | |
| 55 | /* Unlock a semaphore (increment count) */ |
| 56 | extern void PGSemaphoreUnlock(PGSemaphore sema); |
| 57 | |
| 58 | /* Lock a semaphore only if able to do so without blocking */ |
| 59 | extern bool PGSemaphoreTryLock(PGSemaphore sema); |
| 60 | |
| 61 | #endif /* PG_SEMA_H */ |
| 62 | |