1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* ***** BEGIN LICENSE BLOCK ***** 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The contents of this file are subject to the Mozilla Public License Version 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1.1 (the "License"); you may not use this file except in compliance with 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the License. You may obtain a copy of the License at 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * http://www.mozilla.org/MPL/ 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Software distributed under the License is distributed on an "AS IS" basis, 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for the specific language governing rights and limitations under the 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * License. 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The Original Code is the Netscape security libraries. 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The Initial Developer of the Original Code is 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Netscape Communications Corporation. 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Portions created by the Initial Developer are Copyright (C) 2001 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the Initial Developer. All Rights Reserved. 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Contributor(s): 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Alternatively, the contents of this file may be used under the terms of 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * either the GNU General Public License Version 2 or later (the "GPL"), or 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * in which case the provisions of the GPL or the LGPL are applicable instead 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * of those above. If you wish to allow use of your version of this file only 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * under the terms of either the GPL or the LGPL, and not to allow others to 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * use your version of this file under the terms of the MPL, indicate your 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * decision by deleting the provisions above and replace them with the notice 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and other provisions required by the GPL or the LGPL. If you do not delete 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the provisions above, a recipient may use your version of this file under 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the terms of any one of the MPL, the GPL or the LGPL. 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * ***** END LICENSE BLOCK ***** */ 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* $Id: sslmutex.h,v 1.12 2009/06/05 02:34:15 nelson%bolyard.com Exp $ */ 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef __SSLMUTEX_H_ 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define __SSLMUTEX_H_ 1 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* What SSL really wants is portable process-shared unnamed mutexes in 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * shared memory, that have the property that if the process that holds 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * them dies, they are released automatically, and that (unlike fcntl 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * record locking) lock to the thread, not to the process. 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * NSPR doesn't provide that. 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Windows has mutexes that meet that description, but they're not portable. 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * POSIX mutexes are not automatically released when the holder dies, 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and other processes/threads cannot release the mutex on behalf of the 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * dead holder. 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * POSIX semaphores can be used to accomplish this on systems that implement 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * process-shared unnamed POSIX semaphores, because a watchdog thread can 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * discover and release semaphores that were held by a dead process. 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * On systems that do not support process-shared POSIX unnamed semaphores, 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * they can be emulated using pipes. 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The performance cost of doing that is not yet measured. 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * So, this API looks a lot like POSIX pthread mutexes. 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "prtypes.h" 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "prlock.h" 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(NETBSD) 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/param.h> /* for __NetBSD_Version__ */ 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(WIN32) 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <wtypes.h> 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef struct 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRBool isMultiProcess; 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WINNT 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* on WINNT we need both the PRLock and the Win32 mutex for fibers */ 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct { 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott union { 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRLock* sslLock; 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HANDLE sslMutx; 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } u; 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} sslMutex; 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef int sslPID; 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(LINUX) || defined(AIX) || defined(BEOS) || defined(BSDI) || (defined(NETBSD) && __NetBSD_Version__ < 500000000) || defined(OPENBSD) 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h> 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "prtypes.h" 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef struct { 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRBool isMultiProcess; 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott union { 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRLock* sslLock; 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct { 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int mPipes[3]; 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRInt32 nWaiters; 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } pipeStr; 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } u; 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} sslMutex; 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef pid_t sslPID; 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(XP_UNIX) /* other types of Unix */ 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h> /* for pid_t */ 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <semaphore.h> /* for sem_t, and sem_* functions */ 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef struct 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRBool isMultiProcess; 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott union { 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRLock* sslLock; 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sem_t sem; 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } u; 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} sslMutex; 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef pid_t sslPID; 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* what platform is this ?? */ 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef struct { 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRBool isMultiProcess; 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott union { 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PRLock* sslLock; 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* include cross-process locking mechanism here */ 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } u; 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} sslMutex; 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef int sslPID; 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "seccomon.h" 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSEC_BEGIN_PROTOS 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern SECStatus sslMutex_Init(sslMutex *sem, int shared); 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern SECStatus sslMutex_Destroy(sslMutex *sem); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern SECStatus sslMutex_Unlock(sslMutex *sem); 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern SECStatus sslMutex_Lock(sslMutex *sem); 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WINNT 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern SECStatus sslMutex_2LevelInit(sslMutex *sem); 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSEC_END_PROTOS 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 156