PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
pg_sema.h
Go to the documentation of this file.
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-2017, 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 */
Size PGSemaphoreShmemSize(int maxSemas)
Definition: posix_sema.c:158
static int port
Definition: pg_regress.c:89
PGSemaphore PGSemaphoreCreate(void)
Definition: posix_sema.c:245
void PGSemaphoreReset(PGSemaphore sema)
Definition: posix_sema.c:278
void PGReserveSemaphores(int maxSemas, int port)
Definition: posix_sema.c:193
size_t Size
Definition: c.h:350
struct PGSemaphoreData * PGSemaphore
Definition: pg_sema.h:34
void PGSemaphoreLock(PGSemaphore sema)
Definition: posix_sema.c:303
void PGSemaphoreUnlock(PGSemaphore sema)
Definition: posix_sema.c:323
bool PGSemaphoreTryLock(PGSemaphore sema)
Definition: posix_sema.c:348