/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef __SSLMUTEX_H_ #define __SSLMUTEX_H_ 1
/* What SSL really wants is portable process-shared unnamed mutexes in *sharedmemory,thathavethepropertythatiftheprocessthatholds *themdies,theyarereleasedautomatically,andthat(unlikefcntl *recordlocking)locktothethread,nottotheprocess. *NSPRdoesn'tprovidethat. *Windowshasmutexesthatmeetthatdescription,butthey'renotportable. *POSIXmutexesarenotautomaticallyreleasedwhentheholderdies, *andotherprocesses/threadscannotreleasethemutexonbehalfofthe *deadholder. *POSIXsemaphorescanbeusedtoaccomplishthisonsystemsthatimplement *process-sharedunnamedPOSIXsemaphores,becauseawatchdogthreadcan *discoverandreleasesemaphoresthatwereheldbyadeadprocess. *Onsystemsthatdonotsupportprocess-sharedPOSIXunnamedsemaphores, *theycanbeemulatedusingpipes. *Theperformancecostofdoingthatisnotyetmeasured. * *So,thisAPIlooksalotlikePOSIXpthreadmutexes.
*/
#include"prtypes.h" #include"prlock.h"
#ifdefined(NETBSD) #include <sys/param.h> /* for __NetBSD_Version__ */ #endif
#ifdefined(WIN32)
#include <wtypes.h>
typedefstruct {
PRBool isMultiProcess; #ifdef WINNT /* on WINNT we need both the PRLock and the Win32 mutex for fibers */ struct { #else union { #endif
PRLock *sslLock;
HANDLE sslMutx;
} u;
} sslMutex;
typedefstruct {
PRBool isMultiProcess; union {
PRLock *sslLock; /* include cross-process locking mechanism here */
} u;
} sslMutex;
#ifdef DARWIN typedef pid_t sslPID; #else typedefint sslPID; #endif
#endif
#include"seccomon.h"
SEC_BEGIN_PROTOS
extern SECStatus sslMutex_Init(sslMutex *sem, int shared);
/* If processLocal is set to true, then just free resources which are *only* associated *withthecurrentprocess.Leaveanysharedresources(includingthestateof
* shared memory) intact. */ extern SECStatus sslMutex_Destroy(sslMutex *sem, PRBool processLocal);