3 //=============================================================================
9 * $Id: os_pthread.h 80826 2008-03-04 14:51:23Z wotte $
11 * @author Don Hinton <dhinton@dresystems.com>
12 * @author This code was originally in various places including ace/OS.h.
14 //=============================================================================
16 #ifndef ACE_OS_INCLUDE_OS_PTHREAD_H
17 #define ACE_OS_INCLUDE_OS_PTHREAD_H
19 #include /**/ "ace/pre.h"
21 #include /**/ "ace/config-all.h"
23 #if !defined (ACE_LACKS_PRAGMA_ONCE)
25 #endif /* ACE_LACKS_PRAGMA_ONCE */
27 #if defined (ACE_HAS_PRIOCNTL)
28 // Need to #include thread.h before #defining THR_BOUND, etc.,
29 // when building without threads on SunOS 5.x.
31 # include /**/ <thread.h>
34 // Need to #include these before #defining USYNC_PROCESS on SunOS 5.x.
35 # include /**/ <sys/rtpriocntl.h>
36 # include /**/ <sys/tspriocntl.h>
37 #endif /* ACE_HAS_PRIOCNTL */
39 #include "ace/os_include/sys/os_types.h"
41 // This needs to go here *first* to avoid problems with AIX.
42 # if defined (ACE_HAS_PTHREADS)
43 # define ACE_DONT_INCLUDE_ACE_SIGNAL_H
44 # include "ace/os_include/os_signal.h"
45 # undef ACE_DONT_INCLUDE_ACE_SIGNAL_H
46 # if defined (DIGITAL_UNIX)
47 # define pthread_self __pthread_self
48 extern "C" pthread_t
pthread_self (void);
49 # endif /* DIGITAL_UNIX */
50 # endif /* ACE_HAS_PTHREADS */
53 #if !defined (ACE_LACKS_PTHREAD_H)
55 # if defined (ACE_TANDEM_T1248_PTHREADS)
56 # include /**/ <spthread.h>
58 # include /**/ <pthread.h>
61 #endif /* !ACE_LACKS_PTHREAD_H */
63 #if defined (ACE_HAS_PTHREAD_NP_H)
64 // FreeBSD declares _np (non-portable) pthread extensions in <pthread_np.h>
65 # include /**/ <pthread_np.h>
68 // @todo: need to reoganize to put includes at the top and the rest of the
69 // code at the bottom. Also, move the classes out of this file.
70 #if defined (ACE_HAS_PTHREADS)
71 # define ACE_SCHED_OTHER SCHED_OTHER
72 # define ACE_SCHED_FIFO SCHED_FIFO
73 # define ACE_SCHED_RR SCHED_RR
75 // Definitions for THREAD- and PROCESS-LEVEL priorities...some
76 // implementations define these while others don't. In order to
77 // further complicate matters, we don't redefine the default (*_DEF)
78 // values if they've already been defined, which allows individual
79 // programs to have their own ACE-wide "default".
81 // PROCESS-level values
82 # if (defined (_POSIX_PRIORITY_SCHEDULING) || defined (ACE_TANDEM_T1248_PTHREADS)) \
83 && !defined(_UNICOS) && !defined(UNIXWARE_7_1)
84 # define ACE_PROC_PRI_FIFO_MIN (sched_get_priority_min(SCHED_FIFO))
85 # define ACE_PROC_PRI_RR_MIN (sched_get_priority_min(SCHED_RR))
87 // HP-UX's other is the SCHED_HPUX class, which uses historical
88 // values that have reverse semantics from POSIX (low value is
89 // more important priority). To use these in pthreads calls,
90 // the values need to be converted. The other scheduling classes
91 // don't need this special treatment.
92 # define ACE_PROC_PRI_OTHER_MIN \
93 (sched_get_priority_min(SCHED_OTHER))
95 # define ACE_PROC_PRI_OTHER_MIN (sched_get_priority_min(SCHED_OTHER))
97 # else /* UNICOS is missing a sched_get_priority_min() implementation,
99 # define ACE_PROC_PRI_FIFO_MIN 0
100 # define ACE_PROC_PRI_RR_MIN 0
101 # define ACE_PROC_PRI_OTHER_MIN 0
104 # if defined (_POSIX_PRIORITY_SCHEDULING) && !defined(UNIXWARE_7_1)
105 # define ACE_PROC_PRI_FIFO_MAX (sched_get_priority_max(SCHED_FIFO))
106 # define ACE_PROC_PRI_RR_MAX (sched_get_priority_max(SCHED_RR))
108 # define ACE_PROC_PRI_OTHER_MAX \
109 (sched_get_priority_max(SCHED_OTHER))
111 # define ACE_PROC_PRI_OTHER_MAX (sched_get_priority_max(SCHED_OTHER))
113 # else /* SCO missing sched_get_priority_max() implementation */
114 # define ACE_PROC_PRI_FIFO_MAX 59
115 # define ACE_PROC_PRI_RR_MAX 59
116 # define ACE_PROC_PRI_OTHER_MAX 59
119 # if !defined(ACE_PROC_PRI_FIFO_DEF)
120 # define ACE_PROC_PRI_FIFO_DEF (ACE_PROC_PRI_FIFO_MIN + (ACE_PROC_PRI_FIFO_MAX - ACE_PROC_PRI_FIFO_MIN)/2)
122 # if !defined(ACE_PROC_PRI_RR_DEF)
123 # define ACE_PROC_PRI_RR_DEF (ACE_PROC_PRI_RR_MIN + (ACE_PROC_PRI_RR_MAX - ACE_PROC_PRI_RR_MIN)/2)
125 # if !defined(ACE_PROC_PRI_OTHER_DEF)
126 # define ACE_PROC_PRI_OTHER_DEF (ACE_PROC_PRI_OTHER_MIN + (ACE_PROC_PRI_OTHER_MAX - ACE_PROC_PRI_OTHER_MIN)/2)
129 // THREAD-level values
130 # if defined(PRI_FIFO_MIN) && defined(PRI_FIFO_MAX) && defined(PRI_RR_MIN) && defined(PRI_RR_MAX) && defined(PRI_OTHER_MIN) && defined(PRI_OTHER_MAX)
131 # if !defined (ACE_THR_PRI_FIFO_MIN)
132 # define ACE_THR_PRI_FIFO_MIN (long) PRI_FIFO_MIN
133 # endif /* !ACE_THR_PRI_FIFO_MIN */
134 # if !defined (ACE_THR_PRI_FIFO_MAX)
135 # define ACE_THR_PRI_FIFO_MAX (long) PRI_FIFO_MAX
136 # endif /* !ACE_THR_PRI_FIFO_MAX */
137 # if !defined (ACE_THR_PRI_RR_MIN)
138 # define ACE_THR_PRI_RR_MIN (long) PRI_RR_MIN
139 # endif /* !ACE_THR_PRI_RR_MIN */
140 # if !defined (ACE_THR_PRI_RR_MAX)
141 # define ACE_THR_PRI_RR_MAX (long) PRI_RR_MAX
142 # endif /* !ACE_THR_PRI_RR_MAX */
143 # if !defined (ACE_THR_PRI_OTHER_MIN)
144 # define ACE_THR_PRI_OTHER_MIN (long) PRI_OTHER_MIN
145 # endif /* !ACE_THR_PRI_OTHER_MIN */
146 # if !defined (ACE_THR_PRI_OTHER_MAX)
147 # define ACE_THR_PRI_OTHER_MAX (long) PRI_OTHER_MAX
148 # endif /* !ACE_THR_PRI_OTHER_MAX */
150 // AIX's priority range is 1 (low) to 127 (high). There aren't
151 // any preprocessor macros I can find. PRIORITY_MIN is for
152 // process priorities, as far as I can see, and does not apply
153 // to thread priority. The 1 to 127 range is from the
154 // pthread_attr_setschedparam man page (Steve Huston, 18-May-2001).
155 # if !defined (ACE_THR_PRI_FIFO_MIN)
156 # define ACE_THR_PRI_FIFO_MIN (long) 1
157 # endif /* !ACE_THR_PRI_FIFO_MIN */
158 # if !defined (ACE_THR_PRI_FIFO_MAX)
159 # define ACE_THR_PRI_FIFO_MAX (long) 127
160 # endif /* !ACE_THR_PRI_FIFO_MAX */
161 # if !defined (ACE_THR_PRI_RR_MIN)
162 # define ACE_THR_PRI_RR_MIN (long) 1
163 # endif /* !ACE_THR_PRI_RR_MIN */
164 # if !defined (ACE_THR_PRI_RR_MAX)
165 # define ACE_THR_PRI_RR_MAX (long) 127
166 # endif /* !ACE_THR_PRI_RR_MAX */
167 # if !defined (ACE_THR_PRI_OTHER_MIN)
168 # define ACE_THR_PRI_OTHER_MIN (long) 1
169 # endif /* !ACE_THR_PRI_OTHER_MIN */
170 # if !defined (ACE_THR_PRI_OTHER_MAX)
171 # define ACE_THR_PRI_OTHER_MAX (long) 127
172 # endif /* !ACE_THR_PRI_OTHER_MAX */
174 # if !defined (ACE_THR_PRI_FIFO_MIN)
175 # define ACE_THR_PRI_FIFO_MIN (long) 0
176 # endif /* !ACE_THR_PRI_FIFO_MIN */
177 # if !defined (ACE_THR_PRI_FIFO_MAX)
178 # define ACE_THR_PRI_FIFO_MAX (long) 59
179 # endif /* !ACE_THR_PRI_FIFO_MAX */
180 # if !defined (ACE_THR_PRI_RR_MIN)
181 # define ACE_THR_PRI_RR_MIN (long) 0
182 # endif /* !ACE_THR_PRI_RR_MIN */
183 # if !defined (ACE_THR_PRI_RR_MAX)
184 # define ACE_THR_PRI_RR_MAX (long) 59
185 # endif /* !ACE_THR_PRI_RR_MAX */
186 # if !defined (ACE_THR_PRI_OTHER_MIN)
187 # define ACE_THR_PRI_OTHER_MIN (long) 0
188 # endif /* !ACE_THR_PRI_OTHER_MIN */
189 # if !defined (ACE_THR_PRI_OTHER_MAX)
190 # define ACE_THR_PRI_OTHER_MAX (long) 127
191 # endif /* !ACE_THR_PRI_OTHER_MAX */
193 # if !defined (ACE_THR_PRI_FIFO_MIN)
194 # define ACE_THR_PRI_FIFO_MIN (long) ACE_PROC_PRI_FIFO_MIN
195 # endif /* !ACE_THR_PRI_FIFO_MIN */
196 # if !defined (ACE_THR_PRI_FIFO_MAX)
197 # define ACE_THR_PRI_FIFO_MAX (long) ACE_PROC_PRI_FIFO_MAX
198 # endif /* !ACE_THR_PRI_FIFO_MAX */
199 # if !defined (ACE_THR_PRI_RR_MIN)
200 # define ACE_THR_PRI_RR_MIN (long) ACE_PROC_PRI_RR_MIN
201 # endif /* !ACE_THR_PRI_RR_MIN */
202 # if !defined (ACE_THR_PRI_RR_MAX)
203 # define ACE_THR_PRI_RR_MAX (long) ACE_PROC_PRI_RR_MAX
204 # endif /* !ACE_THR_PRI_RR_MAX */
205 # if !defined (ACE_THR_PRI_OTHER_MIN)
206 # define ACE_THR_PRI_OTHER_MIN (long) ACE_PROC_PRI_OTHER_MIN
207 # endif /* !ACE_THR_PRI_OTHER_MIN */
208 # if !defined (ACE_THR_PRI_OTHER_MAX)
209 # define ACE_THR_PRI_OTHER_MAX (long) ACE_PROC_PRI_OTHER_MAX
210 # endif /* !ACE_THR_PRI_OTHER_MAX */
212 # if !defined(ACE_THR_PRI_FIFO_DEF)
213 # define ACE_THR_PRI_FIFO_DEF ((ACE_THR_PRI_FIFO_MIN + ACE_THR_PRI_FIFO_MAX)/2)
215 # if !defined(ACE_THR_PRI_RR_DEF)
216 # define ACE_THR_PRI_RR_DEF ((ACE_THR_PRI_RR_MIN + ACE_THR_PRI_RR_MAX)/2)
218 # if !defined(ACE_THR_PRI_OTHER_DEF)
219 # define ACE_THR_PRI_OTHER_DEF ((ACE_THR_PRI_OTHER_MIN + ACE_THR_PRI_OTHER_MAX)/2)
221 // Typedefs to help compatibility with Windows NT and Pthreads.
222 typedef pthread_t ACE_hthread_t
;
223 typedef pthread_t ACE_thread_t
;
225 // native TSS key type
226 typedef pthread_key_t ACE_OS_thread_key_t
;
227 // TSS key type to be used by application
228 # if defined (ACE_HAS_TSS_EMULATION)
229 typedef u_int ACE_thread_key_t
;
230 # else /* ! ACE_HAS_TSS_EMULATION */
231 typedef ACE_OS_thread_key_t ACE_thread_key_t
;
232 # endif /* ! ACE_HAS_TSS_EMULATION */
234 # if !defined (ACE_LACKS_COND_T)
235 typedef pthread_mutex_t ACE_mutex_t
;
236 typedef pthread_cond_t ACE_cond_t
;
237 typedef pthread_condattr_t ACE_condattr_t
;
238 typedef pthread_mutexattr_t ACE_mutexattr_t
;
239 # endif /* ! ACE_LACKS_COND_T */
240 typedef pthread_mutex_t ACE_thread_mutex_t
;
242 # if !defined (PTHREAD_CANCEL_DISABLE)
243 # define PTHREAD_CANCEL_DISABLE 0
244 # endif /* PTHREAD_CANCEL_DISABLE */
246 # if !defined (PTHREAD_CANCEL_ENABLE)
247 # define PTHREAD_CANCEL_ENABLE 0
248 # endif /* PTHREAD_CANCEL_ENABLE */
250 # if !defined (PTHREAD_CANCEL_DEFERRED)
251 # define PTHREAD_CANCEL_DEFERRED 0
252 # endif /* PTHREAD_CANCEL_DEFERRED */
254 # if !defined (PTHREAD_CANCEL_ASYNCHRONOUS)
255 # define PTHREAD_CANCEL_ASYNCHRONOUS 0
256 # endif /* PTHREAD_CANCEL_ASYNCHRONOUS */
258 # define THR_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE
259 # define THR_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE
260 # define THR_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED
261 # define THR_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS
263 # if !defined (PTHREAD_CREATE_JOINABLE)
264 # if defined (PTHREAD_CREATE_UNDETACHED)
265 # define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED
267 # define PTHREAD_CREATE_JOINABLE 0
268 # endif /* PTHREAD_CREATE_UNDETACHED */
269 # endif /* PTHREAD_CREATE_JOINABLE */
271 # if !defined (PTHREAD_CREATE_DETACHED)
272 # define PTHREAD_CREATE_DETACHED 1
273 # endif /* PTHREAD_CREATE_DETACHED */
275 # if !defined (PTHREAD_PROCESS_PRIVATE) && !defined (ACE_HAS_PTHREAD_PROCESS_ENUM)
276 # if defined (PTHREAD_MUTEXTYPE_FAST)
277 # define PTHREAD_PROCESS_PRIVATE PTHREAD_MUTEXTYPE_FAST
279 # define PTHREAD_PROCESS_PRIVATE 0
280 # endif /* PTHREAD_MUTEXTYPE_FAST */
281 # endif /* PTHREAD_PROCESS_PRIVATE */
283 # if !defined (PTHREAD_PROCESS_SHARED) && !defined (ACE_HAS_PTHREAD_PROCESS_ENUM)
284 # if defined (PTHREAD_MUTEXTYPE_FAST)
285 # define PTHREAD_PROCESS_SHARED PTHREAD_MUTEXTYPE_FAST
287 # define PTHREAD_PROCESS_SHARED 1
288 # endif /* PTHREAD_MUTEXTYPE_FAST */
289 # endif /* PTHREAD_PROCESS_SHARED */
291 # if !defined (ACE_HAS_STHREADS)
292 # if !defined (USYNC_THREAD)
293 # define USYNC_THREAD PTHREAD_PROCESS_PRIVATE
294 # endif /* ! USYNC_THREAD */
295 # if !defined (USYNC_PROCESS)
296 # define USYNC_PROCESS PTHREAD_PROCESS_SHARED
297 # endif /* ! USYNC_PROCESS */
298 # endif /* ACE_HAS_STHREADS */
300 /* MM-Graz: prevent warnings */
301 # if !defined (UNIXWARE_7_1)
305 # undef THR_SUSPENDED
308 # define THR_BOUND 0x00000001
309 # define THR_NEW_LWP 0x00000002
310 # define THR_DETACHED 0x00000040
311 # define THR_SUSPENDED 0x00000080
312 # define THR_DAEMON 0x00000100
313 # define THR_SCHED_FIFO 0x00020000
314 # define THR_SCHED_RR 0x00040000
315 # define THR_SCHED_DEFAULT 0x00080000
316 # endif /* UNIXWARE_7_1 */
318 # define THR_JOINABLE 0x00010000
320 # if defined (ACE_HAS_IRIX62_THREADS)
321 # define THR_SCOPE_SYSTEM 0x00100000
323 # define THR_SCOPE_SYSTEM THR_BOUND
324 # endif /*ACE_HAS_IRIX62_THREADS*/
326 # define THR_SCOPE_PROCESS 0x00200000
327 # define THR_INHERIT_SCHED 0x00400000
328 # define THR_EXPLICIT_SCHED 0x00800000
329 # define THR_SCHED_IO 0x01000000
331 # if !defined (ACE_HAS_STHREADS)
332 # if !defined (ACE_HAS_POSIX_SEM) && !defined (ACE_USES_FIFO_SEM)
334 // This needs to be moved out of here.
335 #include /**/ "ace/ACE_export.h"
339 * @brief This is used to implement semaphores for platforms that support
340 * POSIX pthreads, but do *not* support POSIX semaphores, i.e.,
341 * it's a different type than the POSIX <sem_t>.
343 class ACE_Export ACE_sema_t
346 /// Serialize access to internal state.
349 /// Block until there are no waiters.
350 ACE_cond_t count_nonzero_
;
352 /// Count of the semaphore.
355 /// Number of threads that have called <ACE_OS::sema_wait>.
358 # endif /* !ACE_HAS_POSIX_SEM */
360 # if defined (ACE_LACKS_PTHREAD_YIELD) && defined (ACE_HAS_THR_YIELD)
361 // If we are on Solaris we can just reuse the existing
362 // implementations of these synchronization types.
363 # if !defined (ACE_LACKS_RWLOCK_T) && !defined (ACE_HAS_PTHREADS_UNIX98_EXT)
364 # include /**/ <synch.h>
365 typedef rwlock_t ACE_rwlock_t
;
366 # endif /* !ACE_LACKS_RWLOCK_T */
367 # include /**/ <thread.h>
368 # endif /* (ACE_LACKS_PTHREAD_YIELD) && defined (ACE_HAS_THR_YIELD) */
371 # if !defined (ACE_HAS_POSIX_SEM)
372 typedef sema_t ACE_sema_t
;
373 # endif /* !ACE_HAS_POSIX_SEM */
374 # endif /* !ACE_HAS_STHREADS */
376 # if defined (ACE_HAS_PTHREADS_UNIX98_EXT)
377 typedef pthread_rwlock_t ACE_rwlock_t
;
378 # endif /* ACE_HAS_PTHREADS_UNIX98_EXT */
380 # if defined (__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2))
382 // glibc 2.2.x or better has pthread_mutex_timedlock()
383 # ifndef ACE_HAS_MUTEX_TIMEOUTS
384 # define ACE_HAS_MUTEX_TIMEOUTS
385 # endif /* ACE_HAS_MUTEX_TIMEOUTS */
387 // Use new pthread_attr_setstack if XPG6 support is enabled.
388 # if defined (_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0) < 600
389 # define ACE_LACKS_PTHREAD_ATTR_SETSTACK
390 # endif /* (_XOPEN_SOURCE - 0) < 600 */
392 # if !defined (_XOPEN_SOURCE) \
393 || (defined (_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0) < 600)
394 // pthread_mutex_timedlock() prototype is not visible if _XOPEN_SOURCE
395 // is not >= 600 (i.e. for XPG6).
396 extern "C" int pthread_mutex_timedlock (pthread_mutex_t
*mutex
,
397 const struct timespec
* abstime
);
398 # endif /* _XOPEN_SOURCE && _XOPEN_SOURCE < 600 */
400 # endif /* linux && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) */
402 #elif defined (ACE_HAS_STHREADS)
403 # if !defined (ACE_THR_PRI_FIFO_MIN)
404 # define ACE_THR_PRI_FIFO_MIN (long) 0
405 # endif /* !ACE_THR_PRI_FIFO_MIN */
406 # if !defined (ACE_THR_PRI_FIFO_MAX)
407 # define ACE_THR_PRI_FIFO_MAX (long) 59
408 # endif /* !ACE_THR_PRI_FIFO_MAX */
409 # if !defined (ACE_THR_PRI_RR_MIN)
410 # define ACE_THR_PRI_RR_MIN (long) 0
411 # endif /* !ACE_THR_PRI_RR_MIN */
412 # if !defined (ACE_THR_PRI_RR_MAX)
413 # define ACE_THR_PRI_RR_MAX (long) 59
414 # endif /* !ACE_THR_PRI_RR_MAX */
415 # if !defined (ACE_THR_PRI_OTHER_MIN)
416 # define ACE_THR_PRI_OTHER_MIN (long) 0
417 # endif /* !ACE_THR_PRI_OTHER_MIN */
418 # if !defined (ACE_THR_PRI_OTHER_MAX)
419 # define ACE_THR_PRI_OTHER_MAX (long) 127
420 # endif /* !ACE_THR_PRI_OTHER_MAX */
421 #endif /* ACE_HAS_PTHREADS */
423 #include /**/ "ace/post.h"
424 #endif /* ACE_OS_INCLUDE_OS_PTHREAD_H */