os_pthread.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file    os_pthread.h
00006  *
00007  *  threads
00008  *
00009  *  os_pthread.h,v 1.19 2006/05/30 12:15:53 jwillemsen Exp
00010  *
00011  *  @author Don Hinton <dhinton@dresystems.com>
00012  *  @author This code was originally in various places including ace/OS.h.
00013  */
00014 //=============================================================================
00015 
00016 #ifndef ACE_OS_INCLUDE_OS_PTHREAD_H
00017 #define ACE_OS_INCLUDE_OS_PTHREAD_H
00018 
00019 #include /**/ "ace/pre.h"
00020 
00021 #include "ace/config-all.h"
00022 
00023 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00024 # pragma once
00025 #endif /* ACE_LACKS_PRAGMA_ONCE */
00026 
00027 #if defined (ACE_HAS_PRIOCNTL)
00028    // Need to #include thread.h before #defining THR_BOUND, etc.,
00029    // when building without threads on SunOS 5.x.
00030 #  if defined (sun)
00031 #    include /**/ <thread.h>
00032 #  endif /* sun */
00033 
00034    // Need to #include these before #defining USYNC_PROCESS on SunOS 5.x.
00035 #  include /**/ <sys/rtpriocntl.h>
00036 #  include /**/ <sys/tspriocntl.h>
00037 #endif /* ACE_HAS_PRIOCNTL */
00038 
00039 #include "ace/os_include/sys/os_types.h"
00040 
00041 // This needs to go here *first* to avoid problems with AIX.
00042 # if defined (ACE_HAS_PTHREADS)
00043 #   define ACE_DONT_INCLUDE_ACE_SIGNAL_H
00044 #     include "ace/os_include/os_signal.h"
00045 #   undef ACE_DONT_INCLUDE_ACE_SIGNAL_H
00046 #   if defined (DIGITAL_UNIX)
00047 #     define pthread_self __pthread_self
00048 extern "C" pthread_t pthread_self (void);
00049 #   endif /* DIGITAL_UNIX */
00050 # endif /* ACE_HAS_PTHREADS */
00051 
00052 
00053 #if !defined (ACE_LACKS_PTHREAD_H)
00054    extern "C" {
00055 #   if defined (ACE_TANDEM_T1248_PTHREADS)
00056 #   include /**/ <spthread.h>
00057 #   else
00058 #  include /**/ <pthread.h>
00059 #   endif
00060    }
00061 #endif /* !ACE_LACKS_PTHREAD_H */
00062 
00063 #if defined (ACE_HAS_PTHREAD_NP_H)
00064 // FreeBSD declares _np (non-portable) pthread extensions in <pthread_np.h>
00065 #  include /**/ <pthread_np.h>
00066 #endif
00067 
00068 // @todo: need to reoganize to put includes at the top and the rest of the
00069 // code at the bottom.  Also, move the classes out of this file.
00070 #if defined (ACE_HAS_PTHREADS)
00071 #  define ACE_SCHED_OTHER SCHED_OTHER
00072 #  define ACE_SCHED_FIFO SCHED_FIFO
00073 #  define ACE_SCHED_RR SCHED_RR
00074 
00075 // Definitions for mapping POSIX pthreads draft 6 into 1003.1c names
00076 
00077 #  if defined (ACE_HAS_PTHREADS_DRAFT6)
00078 #    define PTHREAD_SCOPE_PROCESS           PTHREAD_SCOPE_LOCAL
00079 #    define PTHREAD_SCOPE_SYSTEM            PTHREAD_SCOPE_GLOBAL
00080 #    define PTHREAD_CREATE_UNDETACHED       0
00081 #    define PTHREAD_CREATE_DETACHED         1
00082 #    define PTHREAD_CREATE_JOINABLE         0
00083 #    define PTHREAD_EXPLICIT_SCHED          0
00084 #    define PTHREAD_MIN_PRIORITY            0
00085 #    define PTHREAD_MAX_PRIORITY            126
00086 #  endif /* ACE_HAS_PTHREADS_DRAFT6 */
00087 
00088 // Definitions for THREAD- and PROCESS-LEVEL priorities...some
00089 // implementations define these while others don't.  In order to
00090 // further complicate matters, we don't redefine the default (*_DEF)
00091 // values if they've already been defined, which allows individual
00092 // programs to have their own ACE-wide "default".
00093 
00094 // PROCESS-level values
00095 #  if (defined (_POSIX_PRIORITY_SCHEDULING) || defined (ACE_TANDEM_T1248_PTHREADS)) \
00096    && !defined(_UNICOS) && !defined(UNIXWARE_7_1)
00097 #    define ACE_PROC_PRI_FIFO_MIN  (sched_get_priority_min(SCHED_FIFO))
00098 #    define ACE_PROC_PRI_RR_MIN    (sched_get_priority_min(SCHED_RR))
00099 #    if defined (HPUX)
00100        // HP-UX's other is the SCHED_HPUX class, which uses historical
00101        // values that have reverse semantics from POSIX (low value is
00102        // more important priority). To use these in pthreads calls,
00103        // the values need to be converted. The other scheduling classes
00104        // don't need this special treatment.
00105 #      define ACE_PROC_PRI_OTHER_MIN \
00106                       (sched_get_priority_min(SCHED_OTHER))
00107 #    else
00108 #      define ACE_PROC_PRI_OTHER_MIN (sched_get_priority_min(SCHED_OTHER))
00109 #    endif /* HPUX */
00110 #  else /* UNICOS is missing a sched_get_priority_min() implementation,
00111               SCO too */
00112 #    define ACE_PROC_PRI_FIFO_MIN  0
00113 #    define ACE_PROC_PRI_RR_MIN    0
00114 #    define ACE_PROC_PRI_OTHER_MIN 0
00115 #  endif
00116 
00117 #  if defined (_POSIX_PRIORITY_SCHEDULING) && !defined(UNIXWARE_7_1)
00118 #    define ACE_PROC_PRI_FIFO_MAX  (sched_get_priority_max(SCHED_FIFO))
00119 #    define ACE_PROC_PRI_RR_MAX    (sched_get_priority_max(SCHED_RR))
00120 #    if defined (HPUX)
00121 #      define ACE_PROC_PRI_OTHER_MAX \
00122                       (sched_get_priority_max(SCHED_OTHER))
00123 #    else
00124 #      define ACE_PROC_PRI_OTHER_MAX (sched_get_priority_max(SCHED_OTHER))
00125 #    endif /* HPUX */
00126 #  else /* SCO missing sched_get_priority_max() implementation */
00127 #    define ACE_PROC_PRI_FIFO_MAX  59
00128 #    define ACE_PROC_PRI_RR_MAX    59
00129 #    define ACE_PROC_PRI_OTHER_MAX 59
00130 #  endif
00131 
00132 #  if !defined(ACE_PROC_PRI_FIFO_DEF)
00133 #    define ACE_PROC_PRI_FIFO_DEF (ACE_PROC_PRI_FIFO_MIN + (ACE_PROC_PRI_FIFO_MAX - ACE_PROC_PRI_FIFO_MIN)/2)
00134 #  endif
00135 #  if !defined(ACE_PROC_PRI_RR_DEF)
00136 #    define ACE_PROC_PRI_RR_DEF (ACE_PROC_PRI_RR_MIN + (ACE_PROC_PRI_RR_MAX - ACE_PROC_PRI_RR_MIN)/2)
00137 #  endif
00138 #  if !defined(ACE_PROC_PRI_OTHER_DEF)
00139 #    define ACE_PROC_PRI_OTHER_DEF (ACE_PROC_PRI_OTHER_MIN + (ACE_PROC_PRI_OTHER_MAX - ACE_PROC_PRI_OTHER_MIN)/2)
00140 #  endif
00141 
00142 // THREAD-level values
00143 #  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)
00144 #    if !defined (ACE_THR_PRI_FIFO_MIN)
00145 #      define ACE_THR_PRI_FIFO_MIN  (long) PRI_FIFO_MIN
00146 #    endif /* !ACE_THR_PRI_FIFO_MIN */
00147 #    if !defined (ACE_THR_PRI_FIFO_MAX)
00148 #      define ACE_THR_PRI_FIFO_MAX  (long) PRI_FIFO_MAX
00149 #    endif /* !ACE_THR_PRI_FIFO_MAX */
00150 #    if !defined (ACE_THR_PRI_RR_MIN)
00151 #      define ACE_THR_PRI_RR_MIN    (long) PRI_RR_MIN
00152 #    endif /* !ACE_THR_PRI_RR_MIN */
00153 #    if !defined (ACE_THR_PRI_RR_MAX)
00154 #      define ACE_THR_PRI_RR_MAX    (long) PRI_RR_MAX
00155 #    endif /* !ACE_THR_PRI_RR_MAX */
00156 #    if !defined (ACE_THR_PRI_OTHER_MIN)
00157 #      define ACE_THR_PRI_OTHER_MIN (long) PRI_OTHER_MIN
00158 #    endif /* !ACE_THR_PRI_OTHER_MIN */
00159 #    if !defined (ACE_THR_PRI_OTHER_MAX)
00160 #      define ACE_THR_PRI_OTHER_MAX (long) PRI_OTHER_MAX
00161 #    endif /* !ACE_THR_PRI_OTHER_MAX */
00162 #  elif defined (AIX)
00163      // AIX's priority range is 1 (low) to 127 (high). There aren't
00164      // any preprocessor macros I can find. PRIORITY_MIN is for
00165      // process priorities, as far as I can see, and does not apply
00166      // to thread priority. The 1 to 127 range is from the
00167      // pthread_attr_setschedparam man page (Steve Huston, 18-May-2001).
00168 #    if !defined (ACE_THR_PRI_FIFO_MIN)
00169 #      define ACE_THR_PRI_FIFO_MIN  (long) 1
00170 #    endif /* !ACE_THR_PRI_FIFO_MIN */
00171 #    if !defined (ACE_THR_PRI_FIFO_MAX)
00172 #      define ACE_THR_PRI_FIFO_MAX  (long) 127
00173 #    endif /* !ACE_THR_PRI_FIFO_MAX */
00174 #    if !defined (ACE_THR_PRI_RR_MIN)
00175 #      define ACE_THR_PRI_RR_MIN    (long) 1
00176 #    endif /* !ACE_THR_PRI_RR_MIN */
00177 #    if !defined (ACE_THR_PRI_RR_MAX)
00178 #      define ACE_THR_PRI_RR_MAX    (long) 127
00179 #    endif /* !ACE_THR_PRI_RR_MAX */
00180 #    if !defined (ACE_THR_PRI_OTHER_MIN)
00181 #      define ACE_THR_PRI_OTHER_MIN (long) 1
00182 #    endif /* !ACE_THR_PRI_OTHER_MIN */
00183 #    if !defined (ACE_THR_PRI_OTHER_MAX)
00184 #      define ACE_THR_PRI_OTHER_MAX (long) 127
00185 #    endif /* !ACE_THR_PRI_OTHER_MAX */
00186 #  elif defined (sun)
00187 #    if !defined (ACE_THR_PRI_FIFO_MIN)
00188 #      define ACE_THR_PRI_FIFO_MIN  (long) 0
00189 #    endif /* !ACE_THR_PRI_FIFO_MIN */
00190 #    if !defined (ACE_THR_PRI_FIFO_MAX)
00191 #      define ACE_THR_PRI_FIFO_MAX  (long) 59
00192 #    endif /* !ACE_THR_PRI_FIFO_MAX */
00193 #    if !defined (ACE_THR_PRI_RR_MIN)
00194 #      define ACE_THR_PRI_RR_MIN    (long) 0
00195 #    endif /* !ACE_THR_PRI_RR_MIN */
00196 #    if !defined (ACE_THR_PRI_RR_MAX)
00197 #      define ACE_THR_PRI_RR_MAX    (long) 59
00198 #    endif /* !ACE_THR_PRI_RR_MAX */
00199 #    if !defined (ACE_THR_PRI_OTHER_MIN)
00200 #      define ACE_THR_PRI_OTHER_MIN (long) 0
00201 #    endif /* !ACE_THR_PRI_OTHER_MIN */
00202 #    if !defined (ACE_THR_PRI_OTHER_MAX)
00203 #      define ACE_THR_PRI_OTHER_MAX (long) 127
00204 #    endif /* !ACE_THR_PRI_OTHER_MAX */
00205 #  else
00206 #    if !defined (ACE_THR_PRI_FIFO_MIN)
00207 #      define ACE_THR_PRI_FIFO_MIN  (long) ACE_PROC_PRI_FIFO_MIN
00208 #    endif /* !ACE_THR_PRI_FIFO_MIN */
00209 #    if !defined (ACE_THR_PRI_FIFO_MAX)
00210 #      define ACE_THR_PRI_FIFO_MAX  (long) ACE_PROC_PRI_FIFO_MAX
00211 #    endif /* !ACE_THR_PRI_FIFO_MAX */
00212 #    if !defined (ACE_THR_PRI_RR_MIN)
00213 #      define ACE_THR_PRI_RR_MIN    (long) ACE_PROC_PRI_RR_MIN
00214 #    endif /* !ACE_THR_PRI_RR_MIN */
00215 #    if !defined (ACE_THR_PRI_RR_MAX)
00216 #      define ACE_THR_PRI_RR_MAX    (long) ACE_PROC_PRI_RR_MAX
00217 #    endif /* !ACE_THR_PRI_RR_MAX */
00218 #    if !defined (ACE_THR_PRI_OTHER_MIN)
00219 #      define ACE_THR_PRI_OTHER_MIN (long) ACE_PROC_PRI_OTHER_MIN
00220 #    endif /* !ACE_THR_PRI_OTHER_MIN */
00221 #    if !defined (ACE_THR_PRI_OTHER_MAX)
00222 #      define ACE_THR_PRI_OTHER_MAX (long) ACE_PROC_PRI_OTHER_MAX
00223 #    endif /* !ACE_THR_PRI_OTHER_MAX */
00224 #  endif
00225 #  if !defined(ACE_THR_PRI_FIFO_DEF)
00226 #    define ACE_THR_PRI_FIFO_DEF  ((ACE_THR_PRI_FIFO_MIN + ACE_THR_PRI_FIFO_MAX)/2)
00227 #  endif
00228 #  if !defined(ACE_THR_PRI_RR_DEF)
00229 #    define ACE_THR_PRI_RR_DEF ((ACE_THR_PRI_RR_MIN + ACE_THR_PRI_RR_MAX)/2)
00230 #  endif
00231 #  if !defined(ACE_THR_PRI_OTHER_DEF)
00232 #    define ACE_THR_PRI_OTHER_DEF ((ACE_THR_PRI_OTHER_MIN + ACE_THR_PRI_OTHER_MAX)/2)
00233 #  endif
00234    // Typedefs to help compatibility with Windows NT and Pthreads.
00235    typedef pthread_t ACE_hthread_t;
00236    typedef pthread_t ACE_thread_t;
00237 
00238    // native TSS key type
00239    typedef pthread_key_t ACE_OS_thread_key_t;
00240    // TSS key type to be used by application
00241 #  if defined (ACE_HAS_TSS_EMULATION)
00242      typedef u_int ACE_thread_key_t;
00243 #  else  /* ! ACE_HAS_TSS_EMULATION */
00244      typedef ACE_OS_thread_key_t ACE_thread_key_t;
00245 #  endif /* ! ACE_HAS_TSS_EMULATION */
00246 
00247 #  if !defined (ACE_LACKS_COND_T)
00248      typedef pthread_mutex_t ACE_mutex_t;
00249      typedef pthread_cond_t ACE_cond_t;
00250      typedef pthread_condattr_t ACE_condattr_t;
00251      typedef pthread_mutexattr_t ACE_mutexattr_t;
00252 #  endif /* ! ACE_LACKS_COND_T */
00253    typedef pthread_mutex_t ACE_thread_mutex_t;
00254 
00255 #  if !defined (PTHREAD_CANCEL_DISABLE)
00256 #    define PTHREAD_CANCEL_DISABLE      0
00257 #  endif /* PTHREAD_CANCEL_DISABLE */
00258 
00259 #  if !defined (PTHREAD_CANCEL_ENABLE)
00260 #    define PTHREAD_CANCEL_ENABLE       0
00261 #  endif /* PTHREAD_CANCEL_ENABLE */
00262 
00263 #  if !defined (PTHREAD_CANCEL_DEFERRED)
00264 #    define PTHREAD_CANCEL_DEFERRED     0
00265 #  endif /* PTHREAD_CANCEL_DEFERRED */
00266 
00267 #  if !defined (PTHREAD_CANCEL_ASYNCHRONOUS)
00268 #    define PTHREAD_CANCEL_ASYNCHRONOUS 0
00269 #  endif /* PTHREAD_CANCEL_ASYNCHRONOUS */
00270 
00271 #  define THR_CANCEL_DISABLE      PTHREAD_CANCEL_DISABLE
00272 #  define THR_CANCEL_ENABLE       PTHREAD_CANCEL_ENABLE
00273 #  define THR_CANCEL_DEFERRED     PTHREAD_CANCEL_DEFERRED
00274 #  define THR_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS
00275 
00276 #  if !defined (PTHREAD_CREATE_JOINABLE)
00277 #    if defined (PTHREAD_CREATE_UNDETACHED)
00278 #      define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED
00279 #    else
00280 #      define PTHREAD_CREATE_JOINABLE 0
00281 #    endif /* PTHREAD_CREATE_UNDETACHED */
00282 #  endif /* PTHREAD_CREATE_JOINABLE */
00283 
00284 #  if !defined (PTHREAD_CREATE_DETACHED)
00285 #    define PTHREAD_CREATE_DETACHED 1
00286 #  endif /* PTHREAD_CREATE_DETACHED */
00287 
00288 #  if !defined (PTHREAD_PROCESS_PRIVATE) && !defined (ACE_HAS_PTHREAD_PROCESS_ENUM)
00289 #    if defined (PTHREAD_MUTEXTYPE_FAST)
00290 #      define PTHREAD_PROCESS_PRIVATE PTHREAD_MUTEXTYPE_FAST
00291 #    else
00292 #      define PTHREAD_PROCESS_PRIVATE 0
00293 #    endif /* PTHREAD_MUTEXTYPE_FAST */
00294 #  endif /* PTHREAD_PROCESS_PRIVATE */
00295 
00296 #  if !defined (PTHREAD_PROCESS_SHARED) && !defined (ACE_HAS_PTHREAD_PROCESS_ENUM)
00297 #    if defined (PTHREAD_MUTEXTYPE_FAST)
00298 #      define PTHREAD_PROCESS_SHARED PTHREAD_MUTEXTYPE_FAST
00299 #    else
00300 #      define PTHREAD_PROCESS_SHARED 1
00301 #    endif /* PTHREAD_MUTEXTYPE_FAST */
00302 #  endif /* PTHREAD_PROCESS_SHARED */
00303 
00304 #  if defined (ACE_HAS_PTHREADS_DRAFT4)
00305 #    if defined (PTHREAD_PROCESS_PRIVATE)
00306 #      if !defined (USYNC_THREAD)
00307 #        define USYNC_THREAD    PTHREAD_PROCESS_PRIVATE
00308 #      endif /* ! USYNC_THREAD */
00309 #    else
00310 #      if !defined (USYNC_THREAD)
00311 #        define USYNC_THREAD    MUTEX_NONRECURSIVE_NP
00312 #      endif /* ! USYNC_THREAD */
00313 #    endif /* PTHREAD_PROCESS_PRIVATE */
00314 
00315 #    if defined (PTHREAD_PROCESS_SHARED)
00316 #      if !defined (USYNC_PROCESS)
00317 #        define USYNC_PROCESS   PTHREAD_PROCESS_SHARED
00318 #      endif /* ! USYNC_PROCESS */
00319 #    else
00320 #      if !defined (USYNC_PROCESS)
00321 #        define USYNC_PROCESS   MUTEX_NONRECURSIVE_NP
00322 #      endif /* ! USYNC_PROCESS */
00323 #    endif /* PTHREAD_PROCESS_SHARED */
00324 #  elif !defined (ACE_HAS_STHREADS)
00325 #    if !defined (USYNC_THREAD)
00326 #      define USYNC_THREAD PTHREAD_PROCESS_PRIVATE
00327 #    endif /* ! USYNC_THREAD */
00328 #      if !defined (USYNC_PROCESS)
00329 #        define USYNC_PROCESS PTHREAD_PROCESS_SHARED
00330 #      endif /* ! USYNC_PROCESS */
00331 #  endif /* ACE_HAS_PTHREADS_DRAFT4 */
00332 
00333    /* MM-Graz:  prevent warnings */
00334 #  if !defined (UNIXWARE_7_1)
00335 #    undef THR_BOUND
00336 #    undef THR_NEW_LWP
00337 #    undef THR_DETACHED
00338 #    undef THR_SUSPENDED
00339 #    undef THR_DAEMON
00340 
00341 #    define THR_BOUND               0x00000001
00342 #    define THR_NEW_LWP             0x00000002
00343 #    define THR_DETACHED            0x00000040
00344 #    define THR_SUSPENDED           0x00000080
00345 #    define THR_DAEMON              0x00000100
00346 #    define THR_SCHED_FIFO          0x00020000
00347 #    define THR_SCHED_RR            0x00040000
00348 #    define THR_SCHED_DEFAULT       0x00080000
00349 #  endif /* UNIXWARE_7_1 */
00350 
00351 #  define THR_JOINABLE            0x00010000
00352 
00353 #  if defined (ACE_HAS_IRIX62_THREADS)
00354 #    define THR_SCOPE_SYSTEM        0x00100000
00355 #  else
00356 #    define THR_SCOPE_SYSTEM        THR_BOUND
00357 #  endif /*ACE_HAS_IRIX62_THREADS*/
00358 
00359 #  define THR_SCOPE_PROCESS       0x00200000
00360 #  define THR_INHERIT_SCHED       0x00400000
00361 #  define THR_EXPLICIT_SCHED      0x00800000
00362 #  define THR_SCHED_IO            0x01000000
00363 
00364 #  if !defined (ACE_HAS_STHREADS)
00365 #    if !defined (ACE_HAS_POSIX_SEM) && !defined (ACE_USES_FIFO_SEM)
00366 
00367 // This needs to be moved out of here.
00368 #include "ace/ACE_export.h"
00369 /**
00370  * @class ACE_sema_t
00371  *
00372  * @brief This is used to implement semaphores for platforms that support
00373  * POSIX pthreads, but do *not* support POSIX semaphores, i.e.,
00374  * it's a different type than the POSIX <sem_t>.
00375  */
00376 class ACE_Export ACE_sema_t
00377 {
00378 public:
00379   /// Serialize access to internal state.
00380   ACE_mutex_t lock_;
00381 
00382   /// Block until there are no waiters.
00383   ACE_cond_t count_nonzero_;
00384 
00385   /// Count of the semaphore.
00386   u_long count_;
00387 
00388   /// Number of threads that have called <ACE_OS::sema_wait>.
00389   u_long waiters_;
00390 };
00391 #    endif /* !ACE_HAS_POSIX_SEM */
00392 
00393 #    if defined (ACE_LACKS_PTHREAD_YIELD) && defined (ACE_HAS_THR_YIELD)
00394        // If we are on Solaris we can just reuse the existing
00395        // implementations of these synchronization types.
00396 #      if !defined (ACE_LACKS_RWLOCK_T)
00397 #        include /**/ <synch.h>
00398          typedef rwlock_t ACE_rwlock_t;
00399 #      endif /* !ACE_LACKS_RWLOCK_T */
00400 #        include /**/ <thread.h>
00401 #    endif /* (ACE_LACKS_PTHREAD_YIELD) && defined (ACE_HAS_THR_YIELD) */
00402 
00403 #  else
00404 #    if !defined (ACE_HAS_POSIX_SEM)
00405        typedef sema_t ACE_sema_t;
00406 #    endif /* !ACE_HAS_POSIX_SEM */
00407 #  endif /* !ACE_HAS_STHREADS */
00408 
00409 #  if defined (ACE_HAS_PTHREADS_UNIX98_EXT)
00410      typedef pthread_rwlock_t ACE_rwlock_t;
00411 #   endif /* ACE_HAS_PTHREADS_UNIX98_EXT */
00412 
00413 #  if defined (__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2))
00414 
00415      // glibc 2.2.x or better has pthread_mutex_timedlock()
00416 #    ifndef ACE_HAS_MUTEX_TIMEOUTS
00417 #      define ACE_HAS_MUTEX_TIMEOUTS
00418 #    endif  /* ACE_HAS_MUTEX_TIMEOUTS */
00419 
00420      // Use new pthread_attr_setstack if XPG6 support is enabled.
00421 #    if defined (_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0) >= 600
00422 #      if !defined (ACE_HAS_PTHREAD_SETSTACK)
00423 #        define ACE_HAS_PTHREAD_SETSTACK
00424 #      endif /* ACE_HAS_PTHREAD_SETSTACK */
00425 #    endif /* (_XOPEN_SOURCE - 0) >= 600 */
00426 
00427 #    if !defined (_XOPEN_SOURCE) \
00428      || (defined (_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0) < 600)
00429        // pthread_mutex_timedlock() prototype is not visible if _XOPEN_SOURCE
00430        // is not >= 600 (i.e. for XPG6).
00431        extern "C" int pthread_mutex_timedlock (pthread_mutex_t *mutex,
00432                                              const struct timespec * abstime);
00433 #    endif  /* _XOPEN_SOURCE && _XOPEN_SOURCE < 600 */
00434 
00435 #  endif  /* linux && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) */
00436 
00437 #endif /* ACE_HAS_PTHREADS */
00438 
00439 #include /**/ "ace/post.h"
00440 #endif /* ACE_OS_INCLUDE_OS_PTHREAD_H */

Generated on Thu Nov 9 09:41:58 2006 for ACE by doxygen 1.3.6