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