1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 /* 7 * File: pripcsem.h 8 * 9 * Description: named semaphores for interprocess 10 * synchronization 11 * 12 * Unrelated processes obtain access to a shared semaphore 13 * by specifying its name. 14 * 15 * Our goal is to support named semaphores on at least 16 * Unix and Win32 platforms. The implementation will use 17 * one of the three native semaphore APIs: POSIX, System V, 18 * and Win32. 19 * 20 * Because POSIX named semaphores have kernel persistence, 21 * we are forced to have a delete function in this API. 22 */ 23 24 #ifndef pripcsem_h___ 25 #define pripcsem_h___ 26 27 #include "prtypes.h" 28 #include "prio.h" 29 30 PR_BEGIN_EXTERN_C 31 32 /* 33 * PRSem is an opaque structure that represents a named 34 * semaphore. 35 */ 36 typedef struct PRSem PRSem; 37 38 /* 39 * PR_OpenSemaphore -- 40 * 41 * Create or open a named semaphore with the specified name. 42 * A handle to the semaphore is returned. 43 * 44 * If the named semaphore doesn't exist and the PR_SEM_CREATE 45 * flag is specified, the named semaphore is created. The 46 * created semaphore needs to be removed from the system with 47 * a PR_DeleteSemaphore call. 48 * 49 * If PR_SEM_CREATE is specified, the third argument is the 50 * access permission bits of the new semaphore (same 51 * interpretation as the mode argument to PR_Open) and the 52 * fourth argument is the initial value of the new semaphore. 53 * If PR_SEM_CREATE is not specified, the third and fourth 54 * arguments are ignored. 55 */ 56 57 #define PR_SEM_CREATE 0x1 /* create if not exist */ 58 #define PR_SEM_EXCL 0x2 /* fail if already exists */ 59 60 NSPR_API(PRSem *) PR_OpenSemaphore( 61 const char *name, PRIntn flags, PRIntn mode, PRUintn value); 62 63 /* 64 * PR_WaitSemaphore -- 65 * 66 * If the value of the semaphore is > 0, decrement the value and return. 67 * If the value is 0, sleep until the value becomes > 0, then decrement 68 * the value and return. 69 * 70 * The "test and decrement" operation is performed atomically. 71 */ 72 73 NSPR_API(PRStatus) PR_WaitSemaphore(PRSem *sem); 74 75 /* 76 * PR_PostSemaphore -- 77 * 78 * Increment the value of the named semaphore by 1. 79 */ 80 81 NSPR_API(PRStatus) PR_PostSemaphore(PRSem *sem); 82 83 /* 84 * PR_CloseSemaphore -- 85 * 86 * Close a named semaphore handle. 87 */ 88 89 NSPR_API(PRStatus) PR_CloseSemaphore(PRSem *sem); 90 91 /* 92 * PR_DeleteSemaphore -- 93 * 94 * Remove a named semaphore from the system. 95 */ 96 97 NSPR_API(PRStatus) PR_DeleteSemaphore(const char *name); 98 99 PR_END_EXTERN_C 100 101 #endif /* pripcsem_h___ */ 102