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.c
8  *
9  * Description: implements the named semaphores API in prsemipc.h
10  * for classic NSPR.  If _PR_HAVE_NAMED_SEMAPHORES is not defined,
11  * the named semaphore functions all fail with the error code
12  * PR_NOT_IMPLEMENTED_ERROR.
13  */
14 
15 #include "primpl.h"
16 
17 #ifdef _PR_PTHREADS
18 
19 #error "This file should not be compiled for the pthreads version"
20 
21 #else
22 
23 #ifndef _PR_HAVE_NAMED_SEMAPHORES
24 
_PR_MD_OPEN_SEMAPHORE(const char * osname,PRIntn flags,PRIntn mode,PRUintn value)25 PRSem * _PR_MD_OPEN_SEMAPHORE(
26     const char *osname, PRIntn flags, PRIntn mode, PRUintn value)
27 {
28     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
29     return NULL;
30 }
31 
_PR_MD_WAIT_SEMAPHORE(PRSem * sem)32 PRStatus _PR_MD_WAIT_SEMAPHORE(PRSem *sem)
33 {
34     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
35     return PR_FAILURE;
36 }
37 
_PR_MD_POST_SEMAPHORE(PRSem * sem)38 PRStatus _PR_MD_POST_SEMAPHORE(PRSem *sem)
39 {
40     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
41     return PR_FAILURE;
42 }
43 
_PR_MD_CLOSE_SEMAPHORE(PRSem * sem)44 PRStatus _PR_MD_CLOSE_SEMAPHORE(PRSem *sem)
45 {
46     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
47     return PR_FAILURE;
48 }
49 
_PR_MD_DELETE_SEMAPHORE(const char * osname)50 PRStatus _PR_MD_DELETE_SEMAPHORE(const char *osname)
51 {
52     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
53     return PR_FAILURE;
54 }
55 
56 #endif /* !_PR_HAVE_NAMED_SEMAPHORES */
57 
PR_OpenSemaphore(const char * name,PRIntn flags,PRIntn mode,PRUintn value)58 PR_IMPLEMENT(PRSem *) PR_OpenSemaphore(
59     const char *name, PRIntn flags, PRIntn mode, PRUintn value)
60 {
61     char osname[PR_IPC_NAME_SIZE];
62 
63     if (!_pr_initialized) {
64         _PR_ImplicitInitialization();
65     }
66     if (_PR_MakeNativeIPCName(name, osname, sizeof(osname), _PRIPCSem)
67         == PR_FAILURE) {
68         return NULL;
69     }
70     return _PR_MD_OPEN_SEMAPHORE(osname, flags, mode, value);
71 }
72 
PR_WaitSemaphore(PRSem * sem)73 PR_IMPLEMENT(PRStatus) PR_WaitSemaphore(PRSem *sem)
74 {
75     return _PR_MD_WAIT_SEMAPHORE(sem);
76 }
77 
PR_PostSemaphore(PRSem * sem)78 PR_IMPLEMENT(PRStatus) PR_PostSemaphore(PRSem *sem)
79 {
80     return _PR_MD_POST_SEMAPHORE(sem);
81 }
82 
PR_CloseSemaphore(PRSem * sem)83 PR_IMPLEMENT(PRStatus) PR_CloseSemaphore(PRSem *sem)
84 {
85     return _PR_MD_CLOSE_SEMAPHORE(sem);
86 }
87 
PR_DeleteSemaphore(const char * name)88 PR_IMPLEMENT(PRStatus) PR_DeleteSemaphore(const char *name)
89 {
90     char osname[PR_IPC_NAME_SIZE];
91 
92     if (!_pr_initialized) {
93         _PR_ImplicitInitialization();
94     }
95     if (_PR_MakeNativeIPCName(name, osname, sizeof(osname), _PRIPCSem)
96         == PR_FAILURE) {
97         return PR_FAILURE;
98     }
99     return _PR_MD_DELETE_SEMAPHORE(osname);
100 }
101 
102 #endif /* _PR_PTHREADS */
103