1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 /* $Id: sslmutex.h,v 1.14 2012/04/25 14:50:12 gerv%gerv.net Exp $ */
6 #define __SSLMUTEX_H_ 1
8 /* What SSL really wants is portable process-shared unnamed mutexes in
9 * shared memory, that have the property that if the process that holds
10 * them dies, they are released automatically, and that (unlike fcntl
11 * record locking) lock to the thread, not to the process.
12 * NSPR doesn't provide that.
13 * Windows has mutexes that meet that description, but they're not portable.
14 * POSIX mutexes are not automatically released when the holder dies,
15 * and other processes/threads cannot release the mutex on behalf of the
17 * POSIX semaphores can be used to accomplish this on systems that implement
18 * process-shared unnamed POSIX semaphores, because a watchdog thread can
19 * discover and release semaphores that were held by a dead process.
20 * On systems that do not support process-shared POSIX unnamed semaphores,
21 * they can be emulated using pipes.
22 * The performance cost of doing that is not yet measured.
24 * So, this API looks a lot like POSIX pthread mutexes.
31 #include <sys/param.h> /* for __NetBSD_Version__ */
40 PRBool isMultiProcess
;
42 /* on WINNT we need both the PRLock and the Win32 mutex for fibers */
54 #elif defined(LINUX) || defined(AIX) || defined(BEOS) || defined(BSDI) || (defined(NETBSD) && __NetBSD_Version__ < 500000000) || defined(OPENBSD)
56 #include <sys/types.h>
60 PRBool isMultiProcess
;
71 #elif defined(XP_UNIX) /* other types of Unix */
73 #include <sys/types.h> /* for pid_t */
74 #include <semaphore.h> /* for sem_t, and sem_* functions */
78 PRBool isMultiProcess
;
89 /* what platform is this ?? */
92 PRBool isMultiProcess
;
95 /* include cross-process locking mechanism here */
103 #include "seccomon.h"
107 extern SECStatus
sslMutex_Init(sslMutex
*sem
, int shared
);
109 /* If processLocal is set to true, then just free resources which are *only* associated
110 * with the current process. Leave any shared resources (including the state of
111 * shared memory) intact. */
112 extern SECStatus
sslMutex_Destroy(sslMutex
*sem
, PRBool processLocal
);
114 extern SECStatus
sslMutex_Unlock(sslMutex
*sem
);
116 extern SECStatus
sslMutex_Lock(sslMutex
*sem
);
120 extern SECStatus
sslMutex_2LevelInit(sslMutex
*sem
);