3b66a50238228349007cb5bd598acc36c094b4be
[shibboleth/sp.git] / shib / shib-threads.h
1 /*
2  * The Shibboleth License, Version 1.
3  * Copyright (c) 2002
4  * University Corporation for Advanced Internet Development, Inc.
5  * All rights reserved
6  *
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * Redistributions of source code must retain the above copyright notice, this
12  * list of conditions and the following disclaimer.
13  *
14  * Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution, if any, must include
17  * the following acknowledgment: "This product includes software developed by
18  * the University Corporation for Advanced Internet Development
19  * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement
20  * may appear in the software itself, if and wherever such third-party
21  * acknowledgments normally appear.
22  *
23  * Neither the name of Shibboleth nor the names of its contributors, nor
24  * Internet2, nor the University Corporation for Advanced Internet Development,
25  * Inc., nor UCAID may be used to endorse or promote products derived from this
26  * software without specific prior written permission. For written permission,
27  * please contact shibboleth@shibboleth.org
28  *
29  * Products derived from this software may not be called Shibboleth, Internet2,
30  * UCAID, or the University Corporation for Advanced Internet Development, nor
31  * may Shibboleth appear in their name, without prior written permission of the
32  * University Corporation for Advanced Internet Development.
33  *
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
36  * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
38  * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
39  * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
40  * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
41  * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT,
42  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
43  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
44  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
46  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
47  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48  */
49
50 /*
51  * shib-threads.h -- abstraction around Pthreads interface
52  *
53  * Created by:  Derek Atkins <derek@ihtfp.com>
54  *
55  * $Id: shib-threads.h,v 1.6 2003/01/30 15:18:36 warlord Exp $
56  */
57
58 #ifndef SHIB_THREADS_H
59 #define SHIB_THREADS_H
60
61 #ifdef WIN32
62 # ifndef SHIB_EXPORTS
63 #  define SHIB_EXPORTS __declspec(dllimport)
64 # endif
65 #else
66 # define SHIB_EXPORTS
67 #endif
68
69 #ifdef __cplusplus
70
71 #include <time.h>
72 #include <signal.h>
73
74 namespace shibboleth {
75
76   //
77   // core thread objects
78   //
79
80   class SHIB_EXPORTS Thread {
81   public:
82     static Thread* create(void* (*start_routine)(void*), void* arg);
83     static void exit(void* return_val);
84     static void mask_all_signals(void);
85 #ifndef WIN32
86     static int mask_signals(int how, const sigset_t *newmask, sigset_t *oldmask);
87 #endif
88     virtual int detach() = 0;
89     virtual int join(void** thread_return) = 0;
90     virtual int kill(int signo) = 0;
91     virtual ~Thread(){};
92   };
93
94   class SHIB_EXPORTS Mutex {
95   public:
96     static Mutex* create();
97
98     virtual int lock() = 0;
99     virtual int unlock() = 0;
100     virtual ~Mutex(){};
101   };
102
103   class SHIB_EXPORTS CondWait {
104   public:
105     static CondWait* create();
106
107     virtual int wait(Mutex*) = 0;
108     virtual int timedwait(Mutex*,int delay_seconds) = 0;
109     virtual int signal() = 0;
110     virtual int broadcast() = 0;
111     virtual ~CondWait(){};
112   };
113
114   class SHIB_EXPORTS RWLock {
115   public:
116     static RWLock* create();
117
118     virtual int rdlock() = 0;
119     virtual int wrlock() = 0;
120     virtual int unlock() = 0;
121     virtual ~RWLock(){};
122   };
123
124   class SHIB_EXPORTS ThreadKey {
125   public:
126     static ThreadKey* create(void (*destroy_fcn)(void*));
127
128     virtual int setData(void* data) = 0;
129     virtual void* getData() = 0;
130     virtual ~ThreadKey(){};
131   };
132
133   //
134   // Helper classes.
135   //
136
137   class SHIB_EXPORTS Lock {
138   public:
139     Lock(Mutex* mtx) : mutex(mtx) { mutex->lock(); }
140     ~Lock() { mutex->unlock(); }
141
142   private:
143     Lock(const Lock&);
144     void operator=(const Lock&);
145     Mutex* mutex;
146   };
147
148   class SHIB_EXPORTS ReadLock {
149   public:
150     ReadLock(RWLock* lock) : rwlock(lock) { rwlock->rdlock(); }
151     ~ReadLock() { rwlock->unlock(); }
152
153   private:
154     ReadLock(const ReadLock&);
155     void operator=(const ReadLock&);
156     RWLock* rwlock;
157   };
158
159 } // namespace
160
161 #endif /* __cplusplus */
162 #endif /* SHIB_THREADS_H */