00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef ACE_OS_NS_THREAD_H
00018 # define ACE_OS_NS_THREAD_H
00019 
00020 # include  "ace/pre.h"
00021 
00022 # include "ace/config-all.h"
00023 
00024 # if !defined (ACE_LACKS_PRAGMA_ONCE)
00025 #  pragma once
00026 # endif 
00027 
00028 # include "ace/Global_Macros.h"
00029 # include "ace/Basic_Types.h"
00030 # include "ace/Default_Constants.h"
00031 # include "ace/os_include/os_pthread.h"
00032 # include "ace/os_include/os_sched.h"
00033 # include "ace/Base_Thread_Adapter.h"
00034 # include "ace/os_include/sys/os_sem.h"
00035 # include "ace/os_include/os_semaphore.h"
00036 # include "ace/OS_Memory.h"
00037 # include "ace/OS_NS_signal.h"
00038 # include "ace/ACE_export.h"
00039 # include "ace/Object_Manager_Base.h"
00040 
00041 # if defined (ACE_EXPORT_MACRO)
00042 #   undef ACE_EXPORT_MACRO
00043 # endif
00044 # define ACE_EXPORT_MACRO ACE_Export
00045 
00046 # if defined (ACE_HAS_PRIOCNTL)
00047   
00048   
00049 #   if defined (sun)
00050 #     include  <thread.h>
00051 #   endif 
00052 
00053   
00054 #   include  <sys/rtpriocntl.h>
00055 #   include  <sys/tspriocntl.h>
00056 # endif 
00057 
00058 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00059 
00060 # if defined (ACE_WIN32)
00061 typedef DWORD ACE_thread_t;
00062 typedef HANDLE ACE_hthread_t;
00063 
00064 typedef DWORD ACE_OS_thread_key_t;
00065 
00066 #   if defined (ACE_HAS_TSS_EMULATION)
00067       typedef u_int ACE_thread_key_t;
00068 #   else  
00069       typedef ACE_OS_thread_key_t ACE_thread_key_t;
00070 #   endif 
00071 # endif 
00072 
00073 ACE_END_VERSIONED_NAMESPACE_DECL
00074 
00075 # if !defined (ACE_HAS_POSIX_SEM) && defined (ACE_USES_FIFO_SEM)
00076 
00077 extern "C" {
00078   typedef struct
00079   {
00080     char* name_;
00081     ACE_HANDLE fd_[2];
00082   } ACE_sema_t;
00083 }
00084 
00085 #endif 
00086 
00087 # if defined (ACE_HAS_THREADS)
00088 
00089 #   if defined (ACE_HAS_STHREADS)
00090 #     include  <synch.h>
00091 #     include  <thread.h>
00092 #     define ACE_SCOPE_PROCESS P_PID
00093 #     define ACE_SCOPE_LWP P_LWPID
00094 #     define ACE_SCOPE_THREAD (ACE_SCOPE_LWP + 1)
00095 #   else
00096 #     define ACE_SCOPE_PROCESS 0
00097 #     define ACE_SCOPE_LWP 1
00098 #     define ACE_SCOPE_THREAD 2
00099 #   endif 
00100 
00101 #   if !defined (ACE_HAS_PTHREADS)
00102 #     define ACE_SCHED_OTHER 0
00103 #     define ACE_SCHED_FIFO 1
00104 #     define ACE_SCHED_RR 2
00105 #   endif 
00106 
00107 #   if defined (ACE_HAS_PTHREADS)
00108 
00109 #   elif defined (ACE_HAS_STHREADS)
00110 
00111 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00112 
00113 
00114 
00115 typedef thread_t ACE_thread_t;
00116 
00117 typedef thread_key_t ACE_OS_thread_key_t;
00118 
00119 #   if defined (ACE_HAS_TSS_EMULATION)
00120       typedef u_int ACE_thread_key_t;
00121 #   else  
00122       typedef ACE_OS_thread_key_t ACE_thread_key_t;
00123 #   endif 
00124 typedef mutex_t ACE_mutex_t;
00125 #     if !defined (ACE_LACKS_RWLOCK_T)
00126 typedef rwlock_t ACE_rwlock_t;
00127 #     endif 
00128 #     if !defined (ACE_HAS_POSIX_SEM) && !defined (ACE_USES_FIFO_SEM)
00129 typedef sema_t ACE_sema_t;
00130 #     endif 
00131 
00132 typedef cond_t ACE_cond_t;
00133 struct ACE_Export ACE_condattr_t
00134 {
00135   int type;
00136 };
00137 struct ACE_Export ACE_mutexattr_t
00138 {
00139   int type;
00140 };
00141 typedef ACE_thread_t ACE_hthread_t;
00142 typedef ACE_mutex_t ACE_thread_mutex_t;
00143 
00144 ACE_END_VERSIONED_NAMESPACE_DECL
00145 
00146 #     define THR_CANCEL_DISABLE      0
00147 #     define THR_CANCEL_ENABLE       0
00148 #     define THR_CANCEL_DEFERRED     0
00149 #     define THR_CANCEL_ASYNCHRONOUS 0
00150 #     define THR_JOINABLE            0
00151 #     define THR_SCHED_FIFO          0
00152 #     define THR_SCHED_RR            0
00153 #     define THR_SCHED_DEFAULT       0
00154 
00155 #   elif defined (ACE_VXWORKS)
00156 #     include  <sysLib.h> // for sysClkRateGet()
00157 #     if !defined (__RTP__)
00158 #       include  <taskLib.h>
00159 #       include  <taskHookLib.h>
00160 #     endif
00161 
00162 
00163 
00164 #     include "ace/os_include/os_fcntl.h"
00165 #     include "ace/os_include/os_netdb.h"
00166 #     include "ace/os_include/os_semaphore.h"
00167 #     include "ace/os_include/os_signal.h"
00168 #     include "ace/os_include/os_stdio.h"
00169 #     include "ace/os_include/os_stdlib.h"
00170 #     include "ace/os_include/os_stropts.h"
00171 #     include "ace/os_include/os_unistd.h"
00172 #     include "ace/os_include/arpa/os_inet.h"
00173 #     include "ace/os_include/sys/os_select.h"
00174 #     include "ace/os_include/sys/os_socket.h"
00175 
00176 
00177 
00178 #     define VX_UNBREAKABLE        0x0002  
00179 #     if !defined (VX_FP_TASK)
00180 #       define VX_FP_TASK            0x0008  
00181 #     endif
00182 #     define VX_PRIVATE_ENV        0x0080  
00183 #     define VX_NO_STACK_FILL      0x0100  
00184 
00185 
00186 #     define THR_CANCEL_DISABLE      0
00187 #     define THR_CANCEL_ENABLE       0
00188 #     define THR_CANCEL_DEFERRED     0
00189 #     define THR_CANCEL_ASYNCHRONOUS 0
00190 #     define THR_BOUND               0
00191 #     define THR_NEW_LWP             0
00192 #     define THR_DETACHED            0
00193 #     define THR_SUSPENDED           0
00194 #     define THR_DAEMON              0
00195 #     define THR_JOINABLE            0
00196 #     define THR_SCHED_FIFO          0
00197 #     define THR_SCHED_RR            0
00198 #     define THR_SCHED_DEFAULT       0
00199 #     define THR_INHERIT_SCHED       0
00200 #     define THR_EXPLICIT_SCHED      0
00201 #     define THR_SCHED_IO            0
00202 #     define THR_SCOPE_SYSTEM        0
00203 #     define THR_SCOPE_PROCESS       0
00204 #     define USYNC_THREAD            0
00205 #     define USYNC_PROCESS           1 
00206 
00207 
00208 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00209 
00210 typedef SEM_ID ACE_mutex_t;
00211 
00212 
00213 typedef ACE_mutex_t ACE_thread_mutex_t;
00214 #     if !defined (ACE_HAS_POSIX_SEM)
00215 
00216 typedef struct
00217 {
00218 
00219   SEM_ID sema_;
00220 
00221 
00222   char *name_;
00223 } ACE_sema_t;
00224 #     endif 
00225 typedef char * ACE_thread_t;
00226 typedef int ACE_hthread_t;
00227 
00228 
00229 
00230 
00231 typedef u_int ACE_OS_thread_key_t;
00232 
00233 #   if defined (ACE_HAS_TSS_EMULATION)
00234       typedef u_int ACE_thread_key_t;
00235 #   else  
00236       typedef ACE_OS_thread_key_t ACE_thread_key_t;
00237 #   endif 
00238 
00239 ACE_END_VERSIONED_NAMESPACE_DECL
00240 
00241       
00242       
00243 #     define ACE_THR_ID_ALLOCATED '\022'
00244 
00245 #   elif defined (ACE_HAS_WTHREADS)
00246 
00247 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00248 
00249 typedef CRITICAL_SECTION ACE_thread_mutex_t;
00250 
00251 typedef struct
00252 {
00253 
00254   int type_;
00255   union
00256   {
00257     HANDLE proc_mutex_;
00258     CRITICAL_SECTION thr_mutex_;
00259   };
00260 } ACE_mutex_t;
00261 
00262 
00263 typedef HANDLE ACE_event_t;
00264 
00265 #     if defined (ACE_WIN32)
00266 
00267 
00268 
00269 #       if !defined (ACE_USES_WINCE_SEMA_SIMULATION)
00270 typedef HANDLE ACE_sema_t;
00271 #       else
00272 
00273 
00274 
00275 
00276 
00277 class ACE_Export ACE_sema_t
00278 {
00279 public:
00280 
00281   ACE_thread_mutex_t lock_;
00282 
00283 
00284   ACE_event_t count_nonzero_;
00285 
00286 
00287   u_int count_;
00288 };
00289 
00290 #       endif 
00291 #     endif 
00292 
00293 ACE_END_VERSIONED_NAMESPACE_DECL
00294 
00295 
00296 #     define USYNC_THREAD 1
00297 #     define USYNC_PROCESS 2
00298 
00299 #     define THR_CANCEL_DISABLE      0
00300 #     define THR_CANCEL_ENABLE       0
00301 #     define THR_CANCEL_DEFERRED     0
00302 #     define THR_CANCEL_ASYNCHRONOUS 0
00303 #     define THR_DETACHED            0x02000000 
00304 #     define THR_BOUND               0          
00305 #     define THR_NEW_LWP             0          
00306 #     define THR_DAEMON              0          
00307 #     define THR_JOINABLE            0          
00308 #     define THR_SUSPENDED   CREATE_SUSPENDED
00309 #     define THR_USE_AFX             0x01000000
00310 #     define THR_SCHED_FIFO          0
00311 #     define THR_SCHED_RR            0
00312 #     define THR_SCHED_DEFAULT       0
00313 #     define THR_INHERIT_SCHED       0
00314 #     define THR_SCOPE_PROCESS       0
00315 #     define THR_SCOPE_SYSTEM        0
00316 #   endif 
00317 
00318 
00319 
00320 
00321 #   if defined (ACE_LACKS_COND_T)
00322 
00323 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00324 
00325 
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 class ACE_Export ACE_cond_t
00335 {
00336 public:
00337 
00338 
00339   long waiters (void) const;
00340 
00341 
00342 
00343   long waiters_;
00344 
00345 
00346   ACE_thread_mutex_t waiters_lock_;
00347 
00348 
00349   ACE_sema_t sema_;
00350 
00351 #     if defined (ACE_VXWORKS)
00352 
00353 
00354 
00355 
00356 
00357   ACE_sema_t waiters_done_;
00358 #     elif defined (ACE_WIN32)
00359 
00360 
00361 
00362 
00363 
00364   HANDLE waiters_done_;
00365 #     else
00366 #       error "Please implement this feature or check your config.h file!"
00367 #     endif 
00368 
00369 
00370   size_t was_broadcast_;
00371 };
00372 
00373 struct ACE_Export ACE_condattr_t
00374 {
00375   int type;
00376 };
00377 
00378 struct ACE_Export ACE_mutexattr_t
00379 {
00380   int type;
00381 };
00382 
00383 ACE_END_VERSIONED_NAMESPACE_DECL
00384 
00385 #   endif 
00386 
00387 #   if defined (ACE_LACKS_RWLOCK_T) && !defined (ACE_HAS_PTHREADS_UNIX98_EXT)
00388 
00389 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 struct ACE_Export ACE_rwlock_t
00401 {
00402 public:
00403 
00404 
00405 
00406   ACE_mutex_t lock_;
00407 
00408 
00409   ACE_cond_t waiting_readers_;
00410 
00411 
00412   int num_waiting_readers_;
00413 
00414 
00415   ACE_cond_t waiting_writers_;
00416 
00417 
00418   int num_waiting_writers_;
00419 
00420 
00421 
00422   int ref_count_;
00423 
00424 
00425   int important_writer_;
00426 
00427 
00428   ACE_cond_t waiting_important_writer_;
00429 };
00430 
00431 ACE_END_VERSIONED_NAMESPACE_DECL
00432 
00433 #   elif defined (ACE_HAS_PTHREADS_UNIX98_EXT)
00434 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00435 typedef pthread_rwlock_t ACE_rwlock_t;
00436 ACE_END_VERSIONED_NAMESPACE_DECL
00437 #   elif defined (ACE_HAS_STHREADS)
00438 #     include  <synch.h>
00439 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00440 typedef rwlock_t ACE_rwlock_t;
00441 ACE_END_VERSIONED_NAMESPACE_DECL
00442 #   endif 
00443 
00444 
00445 
00446 
00447 
00448 
00449 #   if !defined(ACE_THR_PRI_FIFO_DEF)
00450 #     if defined (ACE_WTHREADS)
00451       
00452       
00453       
00454       
00455 #       define ACE_THR_PRI_FIFO_DEF THREAD_PRIORITY_ABOVE_NORMAL
00456 #     else  
00457 #       define ACE_THR_PRI_FIFO_DEF 0
00458 #     endif 
00459 #   endif 
00460 
00461 #   if !defined(ACE_THR_PRI_OTHER_DEF)
00462 #     if defined (ACE_WTHREADS)
00463       
00464       
00465       
00466       
00467 #       define ACE_THR_PRI_OTHER_DEF THREAD_PRIORITY_NORMAL
00468 #     else  
00469 #       define ACE_THR_PRI_OTHER_DEF 0
00470 #     endif 
00471 #   endif 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
00479 
00480 
00481 
00482 
00483 
00484 
00485 
00486 
00487 
00488 
00489 
00490 #   if defined (ACE_HAS_RECURSIVE_MUTEXES)
00491 
00492 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00493 
00494 typedef ACE_thread_mutex_t ACE_recursive_thread_mutex_t;
00495 #     if defined (ACE_WIN32)
00496 
00497 
00498 
00499 struct ACE_recursive_mutex_state
00500 {
00501   
00502   
00503   LONG relock_count_;
00504 };
00505 #     else
00506 
00507 typedef int ACE_recursive_mutex_state;
00508 #     endif 
00509 
00510 ACE_END_VERSIONED_NAMESPACE_DECL
00511 
00512 #   else
00513 
00514 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00515 
00516 
00517 
00518 
00519 
00520 
00521 
00522 
00523 
00524 
00525 
00526 class ACE_recursive_thread_mutex_t
00527 {
00528 public:
00529 
00530   ACE_thread_mutex_t nesting_mutex_;
00531 
00532 
00533 
00534   ACE_cond_t lock_available_;
00535 
00536 
00537   int nesting_level_;
00538 
00539 
00540   ACE_thread_t owner_id_;
00541 };
00542 
00543 
00544 
00545 struct ACE_recursive_mutex_state
00546 {
00547   int nesting_level_;
00548   ACE_thread_t owner_id_;
00549 };
00550 
00551 ACE_END_VERSIONED_NAMESPACE_DECL
00552 
00553 #   endif 
00554 
00555 # else 
00556 
00557 
00558 #   define ACE_SCOPE_PROCESS 0
00559 #   define ACE_SCOPE_LWP 1
00560 #   define ACE_SCOPE_THREAD 2
00561 #   define ACE_SCHED_OTHER 0
00562 #   define ACE_SCHED_FIFO 1
00563 #   define ACE_SCHED_RR 2
00564 #   if !defined (THR_CANCEL_DISABLE)
00565 #     define THR_CANCEL_DISABLE      0
00566 #   endif 
00567 #   if !defined (THR_CANCEL_ENABLE)
00568 #     define THR_CANCEL_ENABLE       0
00569 #   endif 
00570 #   if !defined (THR_CANCEL_DEFERRED)
00571 #     define THR_CANCEL_DEFERRED     0
00572 #   endif 
00573 #   if !defined (THR_CANCEL_ASYNCHRONOUS)
00574 #     define THR_CANCEL_ASYNCHRONOUS 0
00575 #   endif 
00576 #   if !defined (THR_JOINABLE)
00577 #     define THR_JOINABLE    0     
00578 #   endif 
00579 #   if !defined (THR_DETACHED)
00580 #     define THR_DETACHED    0     
00581 #   endif 
00582 #   if !defined (THR_DAEMON)
00583 #     define THR_DAEMON      0     
00584 #   endif 
00585 #   if !defined (THR_BOUND)
00586 #     define THR_BOUND       0     
00587 #   endif 
00588 #   if !defined (THR_NEW_LWP)
00589 #     define THR_NEW_LWP     0     
00590 #   endif 
00591 #   if !defined (THR_SUSPENDED)
00592 #     define THR_SUSPENDED   0     
00593 #   endif 
00594 #   if !defined (THR_SCHED_FIFO)
00595 #     define THR_SCHED_FIFO 0
00596 #   endif 
00597 #   if !defined (THR_SCHED_RR)
00598 #     define THR_SCHED_RR 0
00599 #   endif 
00600 #   if !defined (THR_SCHED_DEFAULT)
00601 #     define THR_SCHED_DEFAULT 0
00602 #   endif 
00603 #   if !defined (THR_INHERIT_SCHED)
00604 #     define THR_INHERIT_SCHED 0
00605 #   endif 
00606 #   if !defined (USYNC_THREAD)
00607 #     define USYNC_THREAD 0
00608 #   endif 
00609 #   if !defined (USYNC_PROCESS)
00610 #     define USYNC_PROCESS 0
00611 #   endif 
00612 #   if !defined (THR_SCOPE_PROCESS)
00613 #     define THR_SCOPE_PROCESS 0
00614 #   endif 
00615 #   if !defined (THR_SCOPE_SYSTEM)
00616 #     define THR_SCOPE_SYSTEM 0
00617 #   endif 
00618 
00619 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00620 
00621 
00622 typedef int ACE_cond_t;
00623 struct ACE_Export ACE_condattr_t
00624 {
00625   int type;
00626 };
00627 struct ACE_Export ACE_mutexattr_t
00628 {
00629   int type;
00630 };
00631 typedef int ACE_mutex_t;
00632 typedef int ACE_thread_mutex_t;
00633 typedef int ACE_recursive_thread_mutex_t;
00634 typedef int ACE_recursive_mutex_state;
00635 #   if !defined (ACE_HAS_POSIX_SEM) && !defined (ACE_USES_FIFO_SEM)
00636 typedef int ACE_sema_t;
00637 #   endif 
00638 typedef int ACE_rwlock_t;
00639 typedef int ACE_thread_t;
00640 typedef int ACE_hthread_t;
00641 
00642 typedef unsigned int ACE_OS_thread_key_t;
00643 
00644 #   if defined (ACE_HAS_TSS_EMULATION)
00645       typedef u_int ACE_thread_key_t;
00646 #   else  
00647       typedef ACE_OS_thread_key_t ACE_thread_key_t;
00648 #   endif 
00649 
00650 ACE_END_VERSIONED_NAMESPACE_DECL
00651 
00652 
00653 
00654 
00655 
00656 
00657 #   if !defined(ACE_THR_PRI_FIFO_DEF)
00658 #     define ACE_THR_PRI_FIFO_DEF 0
00659 #   endif 
00660 #   if !defined(ACE_THR_PRI_OTHER_DEF)
00661 #     define ACE_THR_PRI_OTHER_DEF 0
00662 #   endif 
00663 
00664 # endif 
00665 
00666 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674 
00675 class ACE_Export ACE_Thread_ID
00676 {
00677 public:
00678 
00679 
00680   ACE_Thread_ID (ACE_thread_t thr_id,
00681                  ACE_hthread_t thr_handle);
00682 
00683 
00684   ACE_Thread_ID (void);
00685 
00686 
00687   ACE_Thread_ID (const ACE_Thread_ID &rhs);
00688 
00689 
00690   ACE_thread_t id (void) const;
00691 
00692 
00693   void id (ACE_thread_t);
00694 
00695 
00696   ACE_hthread_t handle (void) const;
00697 
00698 
00699   void handle (ACE_hthread_t);
00700 
00701   
00702   void to_string (char *thr_string) const;
00703 
00704 
00705   bool operator== (const ACE_Thread_ID &) const;
00706 
00707 
00708   bool operator!= (const ACE_Thread_ID &) const;
00709 
00710 private:
00711 
00712   ACE_thread_t thread_id_;
00713 
00714 
00715   ACE_hthread_t thread_handle_;
00716 };
00717 
00718 
00719 
00720 
00721 typedef int ACE_Sched_Priority;
00722 
00723 # if !defined (ACE_DEFAULT_SYNCH_TYPE)
00724 #   if defined (ACE_VXWORKS)
00725       
00726       
00727       
00728 #     define ACE_DEFAULT_SYNCH_TYPE SEM_Q_FIFO
00729 #   else
00730 #     define ACE_DEFAULT_SYNCH_TYPE USYNC_THREAD
00731 #   endif 
00732 #endif 
00733 
00734 
00735 class ACE_Sched_Params;
00736 class ACE_Time_Value;
00737 
00738 #if defined (ACE_WIN32)
00739 typedef int ACE_idtype_t;
00740 typedef DWORD ACE_id_t;
00741 typedef int ACE_pri_t;
00742 #   define ACE_SELF (0)
00743 #else 
00744 #   if defined (ACE_HAS_IDTYPE_T)
00745   typedef idtype_t ACE_idtype_t;
00746 #   else
00747   typedef int ACE_idtype_t;
00748 #   endif 
00749 #   if defined (ACE_HAS_STHREADS) || defined (DIGITAL_UNIX)
00750 #     if defined (ACE_LACKS_PRI_T)
00751     typedef int pri_t;
00752 #     endif 
00753   typedef id_t ACE_id_t;
00754 #     define ACE_SELF P_MYID
00755   typedef pri_t ACE_pri_t;
00756 #   else  
00757   typedef long ACE_id_t;
00758 #     define ACE_SELF (-1)
00759   typedef short ACE_pri_t;
00760 #   endif 
00761 #endif 
00762 
00763 # if defined (ACE_HAS_TSS_EMULATION)
00764     
00765 #   if !defined (ACE_DEFAULT_THREAD_KEYS)
00766 #     define ACE_DEFAULT_THREAD_KEYS 64
00767 #   endif 
00768 
00769 
00770 class ACE_TSS_Keys;
00771 
00772 
00773 
00774 
00775 
00776 
00777 
00778 
00779 
00780 
00781 
00782 class ACE_Export ACE_TSS_Emulation
00783 {
00784 public:
00785   typedef void (*ACE_TSS_DESTRUCTOR)(void *value) ;
00786 
00787 
00788   enum { ACE_TSS_THREAD_KEYS_MAX = ACE_DEFAULT_THREAD_KEYS };
00789 
00790 
00791   static u_int total_keys ();
00792 
00793 
00794 
00795   static int next_key (ACE_thread_key_t &key);
00796 
00797 
00798 
00799   static int release_key (ACE_thread_key_t key);
00800 
00801 
00802   static int is_key (ACE_thread_key_t key);
00803 
00804 
00805 
00806   static ACE_TSS_DESTRUCTOR tss_destructor (const ACE_thread_key_t key);
00807 
00808 
00809 
00810   static void tss_destructor (const ACE_thread_key_t key,
00811                               ACE_TSS_DESTRUCTOR destructor);
00812 
00813 
00814 
00815   static void *&ts_object (const ACE_thread_key_t key);
00816 
00817 
00818 
00819 
00820 
00821 
00822 
00823 
00824 
00825 
00826 
00827   static void *tss_open (void *ts_storage[ACE_TSS_THREAD_KEYS_MAX]);
00828 
00829 
00830   static void tss_close ();
00831 
00832 private:
00833   
00834 
00835 
00836   static u_int total_keys_;
00837 
00838 
00839 
00840   static ACE_TSS_DESTRUCTOR tss_destructor_ [ACE_TSS_THREAD_KEYS_MAX];
00841 
00842 
00843 
00844 
00845   
00846   
00847   
00848   
00849   
00850   
00851   
00852   
00853   
00854   static ACE_TSS_Keys* tss_keys_used_;
00855 
00856 #   if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
00857 
00858   static void **tss_base (void* ts_storage[] = 0, u_int *ts_created = 0);
00859 #   else  
00860 
00861   static void **&tss_base ();
00862 #   endif 
00863 
00864 #   if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
00865   
00866   
00867   static ACE_OS_thread_key_t native_tss_key_;
00868 
00869   
00870   static int key_created_;
00871 #   endif 
00872 };
00873 
00874 # else   
00875     
00876     
00877 #   if defined (TLS_MINIMUM_AVAILABLE) && !defined (ACE_DEFAULT_THREAD_KEYS)
00878     
00879 #     define ACE_DEFAULT_THREAD_KEYS TLS_MINIMUM_AVAILABLE
00880 #   endif 
00881 
00882 # endif 
00883 
00884 
00885 
00886 
00887 # if defined (ACE_WIN32) || defined (ACE_HAS_TSS_EMULATION)
00888 
00889 
00890 
00891 
00892 
00893 
00894 
00895 
00896 class ACE_TSS_Ref
00897 {
00898 public:
00899 
00900   ACE_TSS_Ref (ACE_thread_t id);
00901 
00902 
00903   ACE_TSS_Ref (void);
00904 
00905 
00906   bool operator== (const ACE_TSS_Ref &) const;
00907 
00908 
00909   bool operator!= (const ACE_TSS_Ref &) const;
00910 
00911 
00912 
00913 
00914   ACE_thread_t tid_;
00915 };
00916 
00917 
00918 
00919 
00920 
00921 
00922 
00923 
00924 class ACE_TSS_Info
00925 {
00926 public:
00927 
00928   typedef void (*Destructor)(void *);
00929 
00930 
00931   ACE_TSS_Info (ACE_thread_key_t key,
00932                 Destructor dest = 0);
00933 
00934 
00935   ACE_TSS_Info (void);
00936 
00937 
00938   int key_in_use (void) const { return thread_count_ != -1; }
00939 
00940 
00941 
00942   void key_in_use (int flag) { thread_count_ = flag == 0  ?  -1  :  1; }
00943 
00944 
00945   bool operator== (const ACE_TSS_Info &) const;
00946 
00947 
00948   bool operator!= (const ACE_TSS_Info &) const;
00949 
00950 
00951   void dump (void);
00952 
00953 private:
00954 
00955   ACE_thread_key_t key_;
00956 
00957 
00958   Destructor destructor_;
00959 
00960 
00961 
00962   int thread_count_;
00963 
00964   friend class ACE_TSS_Cleanup;
00965 };
00966 
00967 
00968 
00969 
00970 
00971 
00972 
00973 
00974 
00975 
00976 
00977 
00978 class ACE_TSS_Keys
00979 {
00980 public:
00981 
00982   ACE_TSS_Keys (void);
00983 
00984 
00985 
00986   int test_and_set (const ACE_thread_key_t key);
00987 
00988 
00989 
00990   int test_and_clear (const ACE_thread_key_t key);
00991 
00992 
00993 
00994   int is_set (const ACE_thread_key_t key) const;
00995 
00996 private:
00997 
00998   static void find (const u_int key, u_int &word, u_int &bit);
00999 
01000   enum
01001     {
01002 #   if ACE_SIZEOF_LONG == 8
01003       ACE_BITS_PER_WORD = 64,
01004 #   elif ACE_SIZEOF_LONG == 4
01005       ACE_BITS_PER_WORD = 32,
01006 #   else
01007 #     error ACE_TSS_Keys only supports 32 or 64 bit longs.
01008 #   endif 
01009       ACE_WORDS = (ACE_DEFAULT_THREAD_KEYS - 1) / ACE_BITS_PER_WORD + 1
01010     };
01011 
01012 
01013 
01014   u_long key_bit_words_[ACE_WORDS];
01015 };
01016 
01017 # endif 
01018 
01019 
01020 
01021 # if defined (ACE_HAS_NONSCALAR_THREAD_KEY_T)
01022 #   define ACE_KEY_INDEX(OBJ,KEY) \
01023   u_int OBJ; \
01024   ACE_OS::memcpy (&OBJ, &KEY, sizeof (u_int))
01025 # else
01026 #   define ACE_KEY_INDEX(OBJ,KEY) u_int OBJ = KEY
01027 # endif 
01028 
01029 ACE_END_VERSIONED_NAMESPACE_DECL
01030 
01031 #if (defined (ACE_HAS_VERSIONED_NAMESPACE) && ACE_HAS_VERSIONED_NAMESPACE == 1)
01032 # define ACE_MUTEX_LOCK_CLEANUP_ADAPTER_NAME ACE_PREPROC_CONCATENATE(ACE_VERSIONED_NAMESPACE_NAME, _ace_mutex_lock_cleanup_adapter)
01033 #endif  
01034 
01035 
01036 # if defined (ACE_HAS_THR_C_FUNC)
01037 
01038 extern "C" ACE_Export void ACE_MUTEX_LOCK_CLEANUP_ADAPTER_NAME (void *args);
01039 #   define ACE_PTHREAD_CLEANUP_PUSH(A) pthread_cleanup_push (ACE_MUTEX_LOCK_CLEANUP_ADAPTER_NAME, (void *) A);
01040 #   define ACE_PTHREAD_CLEANUP_POP(A) pthread_cleanup_pop(A)
01041 # elif defined (ACE_HAS_PTHREADS) && !defined (ACE_LACKS_PTHREAD_CLEANUP)
01042 
01043 
01044 
01045 
01046 extern "C" ACE_Export void ACE_MUTEX_LOCK_CLEANUP_ADAPTER_NAME (void *args);
01047 #   define ACE_PTHREAD_CLEANUP_PUSH(A) pthread_cleanup_push (ACE_MUTEX_LOCK_CLEANUP_ADAPTER_NAME, (void *) A);
01048 #   define ACE_PTHREAD_CLEANUP_POP(A) pthread_cleanup_pop(A)
01049 # else
01050 #   define ACE_PTHREAD_CLEANUP_PUSH(A)
01051 #   define ACE_PTHREAD_CLEANUP_POP(A)
01052 # endif 
01053 
01054 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
01055 
01056 # if !defined (ACE_WIN32)
01057 
01058 class ACE_event_t;
01059 # endif
01060 
01061 class ACE_Base_Thread_Adapter;
01062 
01063 namespace ACE_OS {
01064 
01065 
01066 
01067 
01068   extern ACE_Export ACE_thread_t NULL_thread;
01069 
01070 
01071 
01072   extern ACE_Export ACE_hthread_t NULL_hthread;
01073 
01074 
01075 
01076   extern ACE_Export ACE_thread_key_t NULL_key;
01077 
01078 
01079 
01080 
01081 
01082 
01083 
01084   extern ACE_Export
01085   void cleanup_tss (const u_int main_thread);
01086 
01087 
01088 #if defined (ACE_LACKS_COND_T)
01089   extern ACE_Export
01090 #else
01091   ACE_NAMESPACE_INLINE_FUNCTION
01092 #endif 
01093   int condattr_init (ACE_condattr_t &attributes,
01094                      int type = ACE_DEFAULT_SYNCH_TYPE);
01095 
01096 #if defined (ACE_LACKS_COND_T)
01097   extern ACE_Export
01098 #else
01099   ACE_NAMESPACE_INLINE_FUNCTION
01100 #endif 
01101   int condattr_destroy (ACE_condattr_t &attributes);
01102 
01103 #if defined (ACE_LACKS_COND_T)
01104   extern ACE_Export
01105 #else
01106   ACE_NAMESPACE_INLINE_FUNCTION
01107 #endif 
01108   int cond_broadcast (ACE_cond_t *cv);
01109 
01110 #if defined (ACE_LACKS_COND_T)
01111   extern ACE_Export
01112 #else
01113   ACE_NAMESPACE_INLINE_FUNCTION
01114 #endif 
01115   int cond_destroy (ACE_cond_t *cv);
01116 
01117   extern ACE_Export
01118   int cond_init (ACE_cond_t *cv,
01119                  short type = ACE_DEFAULT_SYNCH_TYPE,
01120                  const char *name = 0,
01121                  void *arg = 0);
01122 
01123 #if defined (ACE_LACKS_COND_T)
01124   extern ACE_Export
01125 #else
01126   ACE_NAMESPACE_INLINE_FUNCTION
01127 #endif 
01128   int cond_init (ACE_cond_t *cv,
01129                  ACE_condattr_t &attributes,
01130                  const char *name = 0,
01131                  void *arg = 0);
01132 
01133 # if defined (ACE_HAS_WCHAR)
01134 #   if defined (ACE_LACKS_COND_T)
01135   extern ACE_Export
01136 #   else
01137   ACE_NAMESPACE_INLINE_FUNCTION
01138 #   endif 
01139   int cond_init (ACE_cond_t *cv,
01140                  short type,
01141                  const wchar_t *name,
01142                  void *arg = 0);
01143 
01144 #   if defined (ACE_LACKS_COND_T)
01145   extern ACE_Export
01146 #   else
01147   ACE_NAMESPACE_INLINE_FUNCTION
01148 #   endif 
01149   int cond_init (ACE_cond_t *cv,
01150                  ACE_condattr_t &attributes,
01151                  const wchar_t *name,
01152                  void *arg = 0);
01153 # endif 
01154 
01155 #if defined (ACE_LACKS_COND_T)
01156   extern ACE_Export
01157 #else
01158   ACE_NAMESPACE_INLINE_FUNCTION
01159 #endif 
01160   int cond_signal (ACE_cond_t *cv);
01161 
01162 #if defined (ACE_LACKS_COND_T)
01163   extern ACE_Export
01164 #else
01165   ACE_NAMESPACE_INLINE_FUNCTION
01166 #endif 
01167   int cond_timedwait (ACE_cond_t *cv,
01168                       ACE_mutex_t *m,
01169                       ACE_Time_Value *);
01170 
01171 #if defined (ACE_LACKS_COND_T)
01172   extern ACE_Export
01173 #else
01174   ACE_NAMESPACE_INLINE_FUNCTION
01175 #endif 
01176   int cond_wait (ACE_cond_t *cv,
01177                  ACE_mutex_t *m);
01178 
01179 # if defined (ACE_WIN32) && defined (ACE_HAS_WTHREADS)
01180 #   if defined (ACE_LACKS_COND_T)
01181   extern ACE_Export
01182 #   else
01183   ACE_NAMESPACE_INLINE_FUNCTION
01184 #   endif 
01185   int cond_timedwait (ACE_cond_t *cv,
01186                       ACE_thread_mutex_t *m,
01187                       ACE_Time_Value *);
01188 
01189 #   if defined (ACE_LACKS_COND_T)
01190   extern ACE_Export
01191 #   else
01192   ACE_NAMESPACE_INLINE_FUNCTION
01193 #   endif 
01194   int cond_wait (ACE_cond_t *cv,
01195                  ACE_thread_mutex_t *m);
01196 # endif 
01197 
01198 
01199 
01200   extern ACE_Export
01201   int event_destroy (ACE_event_t *event);
01202 
01203   extern ACE_Export
01204   int event_init (ACE_event_t *event,
01205                   int manual_reset = 0,
01206                   int initial_state = 0,
01207                   int type = ACE_DEFAULT_SYNCH_TYPE,
01208                   const char *name = 0,
01209                   void *arg = 0,
01210                   LPSECURITY_ATTRIBUTES sa = 0);
01211 
01212 # if defined (ACE_HAS_WCHAR)
01213   ACE_NAMESPACE_INLINE_FUNCTION
01214   int event_init (ACE_event_t *event,
01215                   int manual_reset,
01216                   int initial_state,
01217                   int type,
01218                   const wchar_t *name,
01219                   void *arg = 0,
01220                   LPSECURITY_ATTRIBUTES sa = 0);
01221 # endif 
01222 
01223   extern ACE_Export
01224   int event_pulse (ACE_event_t *event);
01225 
01226   extern ACE_Export
01227   int event_reset (ACE_event_t *event);
01228 
01229   extern ACE_Export
01230   int event_signal (ACE_event_t *event);
01231 
01232   extern ACE_Export
01233   int event_timedwait (ACE_event_t *event,
01234                        ACE_Time_Value *timeout,
01235                        int use_absolute_time = 1);
01236 
01237   extern ACE_Export
01238   int event_wait (ACE_event_t *event);
01239 
01240 
01241 
01242   extern ACE_Export
01243   int lwp_getparams (ACE_Sched_Params &);
01244 
01245   extern ACE_Export
01246   int lwp_setparams (const ACE_Sched_Params &);
01247 
01248 
01249 
01250 
01251   extern ACE_Export
01252   int mutex_destroy (ACE_mutex_t *m);
01253 
01254   extern ACE_Export
01255   int mutex_init (ACE_mutex_t *m,
01256                   int lock_scope = ACE_DEFAULT_SYNCH_TYPE,
01257                   const char *name = 0,
01258                   ACE_mutexattr_t *arg = 0,
01259                   LPSECURITY_ATTRIBUTES sa = 0,
01260                   int lock_type = 0);
01261 
01262 #if defined (ACE_HAS_WCHAR)
01263   extern ACE_Export
01264   int mutex_init (ACE_mutex_t *m,
01265                   int lock_scope,
01266                   const wchar_t *name,
01267                   ACE_mutexattr_t *arg = 0,
01268                   LPSECURITY_ATTRIBUTES sa = 0,
01269                   int lock_type = 0);
01270 #endif 
01271 
01272 
01273 
01274   extern ACE_Export
01275   int mutex_lock (ACE_mutex_t *m);
01276 
01277 
01278 
01279   extern ACE_Export
01280   int mutex_lock (ACE_mutex_t *m,
01281                   int &abandoned);
01282 
01283 
01284 
01285 
01286 
01287 
01288 
01289 
01290 
01291 
01292 
01293 
01294 
01295   extern ACE_Export
01296   int mutex_lock (ACE_mutex_t *m,
01297                   const ACE_Time_Value &timeout);
01298 
01299 
01300 
01301 
01302 
01303 
01304 
01305 
01306 
01307 
01308 
01309 
01310   ACE_NAMESPACE_INLINE_FUNCTION
01311   int mutex_lock (ACE_mutex_t *m,
01312                   const ACE_Time_Value *timeout);
01313 
01314 
01315   extern ACE_Export
01316   void mutex_lock_cleanup (void *mutex);
01317 
01318 
01319 
01320   extern ACE_Export
01321   int mutex_trylock (ACE_mutex_t *m);
01322 
01323 
01324 
01325   extern ACE_Export
01326   int mutex_trylock (ACE_mutex_t *m,
01327                      int &abandoned);
01328 
01329   extern ACE_Export
01330   int mutex_unlock (ACE_mutex_t *m);
01331 
01332 
01333 
01334 
01335 
01336 
01337 
01338 
01339   ACE_NAMESPACE_INLINE_FUNCTION
01340   long priority_control (ACE_idtype_t, ACE_id_t, int, void *);
01341 
01342 
01343 
01344   
01345   
01346   
01347   ACE_NAMESPACE_INLINE_FUNCTION
01348   int recursive_mutex_cond_unlock (ACE_recursive_thread_mutex_t *m,
01349                                    ACE_recursive_mutex_state &state);
01350 
01351   ACE_NAMESPACE_INLINE_FUNCTION
01352   void recursive_mutex_cond_relock (ACE_recursive_thread_mutex_t *m,
01353                                     ACE_recursive_mutex_state &state);
01354 
01355   ACE_NAMESPACE_INLINE_FUNCTION
01356   int recursive_mutex_destroy (ACE_recursive_thread_mutex_t *m);
01357 
01358   ACE_NAMESPACE_INLINE_FUNCTION
01359   int recursive_mutex_init (ACE_recursive_thread_mutex_t *m,
01360                             const ACE_TCHAR *name = 0,
01361                             ACE_mutexattr_t *arg = 0,
01362                             LPSECURITY_ATTRIBUTES sa = 0);
01363 
01364   ACE_NAMESPACE_INLINE_FUNCTION
01365   int recursive_mutex_lock (ACE_recursive_thread_mutex_t *m);
01366 
01367   ACE_NAMESPACE_INLINE_FUNCTION
01368   int recursive_mutex_lock (ACE_recursive_thread_mutex_t *m,
01369                             const ACE_Time_Value &timeout);
01370 
01371   ACE_NAMESPACE_INLINE_FUNCTION
01372   int recursive_mutex_lock (ACE_recursive_thread_mutex_t *m,
01373                             const ACE_Time_Value *timeout);
01374 
01375   ACE_NAMESPACE_INLINE_FUNCTION
01376   int recursive_mutex_trylock (ACE_recursive_thread_mutex_t *m);
01377 
01378   ACE_NAMESPACE_INLINE_FUNCTION
01379   int recursive_mutex_unlock (ACE_recursive_thread_mutex_t *m);
01380 
01381 
01382 
01383 
01384 
01385 
01386   ACE_NAMESPACE_INLINE_FUNCTION
01387   int rw_rdlock (ACE_rwlock_t *rw);
01388 
01389   ACE_NAMESPACE_INLINE_FUNCTION
01390   int rw_tryrdlock (ACE_rwlock_t *rw);
01391 
01392   ACE_NAMESPACE_INLINE_FUNCTION
01393   int rw_trywrlock (ACE_rwlock_t *rw);
01394 
01395   ACE_NAMESPACE_INLINE_FUNCTION
01396   int rw_trywrlock_upgrade (ACE_rwlock_t *rw);
01397 
01398   ACE_NAMESPACE_INLINE_FUNCTION
01399   int rw_unlock (ACE_rwlock_t *rw);
01400 
01401   ACE_NAMESPACE_INLINE_FUNCTION
01402   int rw_wrlock (ACE_rwlock_t *rw);
01403 
01404   ACE_NAMESPACE_INLINE_FUNCTION
01405   int rwlock_destroy (ACE_rwlock_t *rw);
01406 
01407   extern ACE_Export
01408   int rwlock_init (ACE_rwlock_t *rw,
01409                    int type = ACE_DEFAULT_SYNCH_TYPE,
01410                    const ACE_TCHAR *name = 0,
01411                    void *arg = 0);
01412 
01413 
01414 
01415 
01416 
01417 
01418   extern ACE_Export
01419   int sched_params (const ACE_Sched_Params &, ACE_id_t id = ACE_SELF);
01420 
01421 
01422 
01423   extern ACE_Export
01424   int scheduling_class (const char *class_name, ACE_id_t &);
01425 
01426 
01427 
01428   ACE_NAMESPACE_INLINE_FUNCTION
01429   int sema_destroy (ACE_sema_t *s);
01430 
01431   ACE_NAMESPACE_INLINE_FUNCTION
01432   int sema_init (ACE_sema_t *s,
01433                  u_int count,
01434                  int type = ACE_DEFAULT_SYNCH_TYPE,
01435                  const char *name = 0,
01436                  void *arg = 0,
01437                  int max = 0x7fffffff,
01438                  LPSECURITY_ATTRIBUTES sa = 0);
01439 
01440 # if defined (ACE_HAS_WCHAR)
01441   ACE_NAMESPACE_INLINE_FUNCTION
01442   int sema_init (ACE_sema_t *s,
01443                  u_int count,
01444                  int type,
01445                  const wchar_t *name,
01446                  void *arg = 0,
01447                  int max = 0x7fffffff,
01448                  LPSECURITY_ATTRIBUTES sa = 0);
01449 # endif 
01450 
01451   ACE_NAMESPACE_INLINE_FUNCTION
01452   int sema_post (ACE_sema_t *s);
01453 
01454   ACE_NAMESPACE_INLINE_FUNCTION
01455   int sema_post (ACE_sema_t *s,
01456                  u_int release_count);
01457 
01458   ACE_NAMESPACE_INLINE_FUNCTION
01459   int sema_trywait (ACE_sema_t *s);
01460 
01461   ACE_NAMESPACE_INLINE_FUNCTION
01462   int sema_wait (ACE_sema_t *s);
01463 
01464   ACE_NAMESPACE_INLINE_FUNCTION
01465   int sema_wait (ACE_sema_t *s,
01466                  ACE_Time_Value &tv);
01467 
01468   ACE_NAMESPACE_INLINE_FUNCTION
01469   int sema_wait (ACE_sema_t *s,
01470                  ACE_Time_Value *tv);
01471 
01472 
01473 
01474 
01475   ACE_NAMESPACE_INLINE_FUNCTION
01476   int semctl (int int_id,
01477               int semnum,
01478               int cmd,
01479               semun);
01480 
01481   ACE_NAMESPACE_INLINE_FUNCTION
01482   int semget (key_t key,
01483               int nsems,
01484               int flags);
01485 
01486   ACE_NAMESPACE_INLINE_FUNCTION
01487   int semop (int int_id,
01488              struct sembuf *sops,
01489              size_t nsops);
01490 
01491 
01492 
01493   extern ACE_Export
01494   int set_scheduling_params (const ACE_Sched_Params &,
01495                              ACE_id_t id = ACE_SELF);
01496 
01497   ACE_NAMESPACE_INLINE_FUNCTION
01498   int sigtimedwait (const sigset_t *set,
01499                     siginfo_t *info,
01500                     const ACE_Time_Value *timeout);
01501 
01502   ACE_NAMESPACE_INLINE_FUNCTION
01503   int sigwait (sigset_t *set,
01504                int *sig = 0);
01505 
01506   ACE_NAMESPACE_INLINE_FUNCTION
01507   int sigwaitinfo (const sigset_t *set,
01508                    siginfo_t *info);
01509 
01510   ACE_NAMESPACE_INLINE_FUNCTION
01511   int thr_cancel (ACE_thread_t t_id);
01512 
01513   ACE_NAMESPACE_INLINE_FUNCTION
01514   int thr_cmp (ACE_hthread_t t1,
01515                ACE_hthread_t t2);
01516 
01517   
01518   
01519   ACE_NAMESPACE_INLINE_FUNCTION
01520   int thr_continue (ACE_hthread_t target_thread);
01521 
01522   
01523 
01524 
01525 
01526 
01527 
01528 
01529 
01530 
01531 
01532 
01533 
01534 
01535 
01536 
01537 
01538 
01539 
01540 
01541 
01542 
01543 
01544 
01545 
01546 
01547 
01548 
01549 
01550 
01551 
01552   extern ACE_Export
01553   int thr_create (ACE_THR_FUNC func,
01554                   void *args,
01555                   long flags,
01556                   ACE_thread_t *thr_id,
01557                   ACE_hthread_t *t_handle = 0,
01558                   long priority = ACE_DEFAULT_THREAD_PRIORITY,
01559                   void *stack = 0,
01560                   size_t stacksize = 0,
01561                   ACE_Base_Thread_Adapter *thread_adapter = 0);
01562 
01563   ACE_NAMESPACE_INLINE_FUNCTION
01564   int thr_equal (ACE_thread_t t1,
01565                  ACE_thread_t t2);
01566 
01567   extern ACE_Export
01568   void thr_exit (ACE_THR_FUNC_RETURN status = 0);
01569 
01570   ACE_NAMESPACE_INLINE_FUNCTION
01571   int thr_getconcurrency (void);
01572 
01573   ACE_NAMESPACE_INLINE_FUNCTION
01574   int thr_getprio (ACE_hthread_t id,
01575                    int &priority);
01576 
01577   ACE_NAMESPACE_INLINE_FUNCTION
01578   int thr_getprio (ACE_hthread_t id,
01579                    int &priority,
01580                    int &policy);
01581 
01582 # if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
01583   ACE_NAMESPACE_INLINE_FUNCTION
01584 
01585   int thr_getspecific_native (ACE_OS_thread_key_t key,
01586                        void **data);
01587 # endif 
01588 
01589   ACE_NAMESPACE_INLINE_FUNCTION
01590   int thr_getspecific (ACE_thread_key_t key,
01591                        void **data);
01592 
01593 #if defined (ACE_VXWORKS)
01594   extern ACE_Export
01595 #else
01596   ACE_NAMESPACE_INLINE_FUNCTION
01597 #endif 
01598   int thr_join (ACE_hthread_t waiter_id,
01599                 ACE_THR_FUNC_RETURN *status);
01600 
01601 #if defined (ACE_VXWORKS)
01602   extern ACE_Export
01603 #else
01604   ACE_NAMESPACE_INLINE_FUNCTION
01605 #endif 
01606   int thr_join (ACE_thread_t waiter_id,
01607                 ACE_thread_t *thr_id,
01608                 ACE_THR_FUNC_RETURN *status);
01609 
01610 
01611 
01612 
01613 
01614 
01615 
01616 
01617 
01618 
01619 
01620 
01621   extern ACE_Export
01622   int thr_get_affinity (ACE_hthread_t id,
01623                         size_t cpu_set_size,
01624                         cpu_set_t * cpu_mask);
01625 
01626 
01627 
01628 
01629 
01630 
01631 
01632 
01633 
01634 
01635 
01636 
01637 
01638   extern ACE_Export
01639   int thr_set_affinity (ACE_hthread_t thr_id,
01640                         size_t cpu_set_size,
01641                         const cpu_set_t * cpu_mask);
01642 
01643 
01644 
01645 
01646   extern ACE_Export
01647   int thr_key_detach (ACE_thread_key_t key, void * inst);
01648 
01649   extern ACE_Export
01650   int thr_key_used (ACE_thread_key_t key);
01651 
01652 # if defined (ACE_HAS_THR_C_DEST)
01653 #   if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
01654 
01655   extern ACE_Export
01656   int thr_keycreate_native (ACE_OS_thread_key_t *key,
01657                      ACE_THR_C_DEST);
01658 #   endif 
01659 
01660 
01661 
01662 
01663   extern ACE_Export
01664   int thr_keycreate (ACE_thread_key_t *key,
01665                      ACE_THR_C_DEST,
01666                      void *inst = 0);
01667 # else
01668 #   if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
01669 
01670   extern ACE_Export
01671   int thr_keycreate_native (ACE_OS_thread_key_t *key,
01672                      ACE_THR_DEST);
01673 #   endif 
01674 
01675 
01676 
01677   extern ACE_Export
01678   int thr_keycreate (ACE_thread_key_t *key,
01679                      ACE_THR_DEST,
01680                      void *inst = 0);
01681 
01682 # endif 
01683 
01684 # if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
01685 
01686   extern ACE_Export
01687   int thr_keyfree_native (ACE_OS_thread_key_t key);
01688 # endif 
01689 
01690   extern ACE_Export
01691   int thr_keyfree (ACE_thread_key_t key);
01692 
01693   ACE_NAMESPACE_INLINE_FUNCTION
01694   int thr_kill (ACE_thread_t thr_id,
01695                 int signum);
01696 
01697   ACE_NAMESPACE_INLINE_FUNCTION
01698   size_t thr_min_stack (void);
01699 
01700   ACE_NAMESPACE_INLINE_FUNCTION
01701   ACE_thread_t thr_self (void);
01702 
01703   ACE_NAMESPACE_INLINE_FUNCTION
01704   void thr_self (ACE_hthread_t &);
01705 
01706   ACE_NAMESPACE_INLINE_FUNCTION
01707   int thr_setcancelstate (int new_state,
01708                           int *old_state);
01709 
01710   ACE_NAMESPACE_INLINE_FUNCTION
01711   int thr_setcanceltype (int new_type,
01712                          int *old_type);
01713 
01714   ACE_NAMESPACE_INLINE_FUNCTION
01715   int thr_setconcurrency (int hint);
01716 
01717   ACE_NAMESPACE_INLINE_FUNCTION
01718   int thr_setprio (ACE_hthread_t ht_id,
01719                    int priority,
01720                    int policy = -1);
01721 
01722   extern ACE_Export
01723   int thr_setprio (const ACE_Sched_Priority prio);
01724 
01725 # if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
01726 
01727   extern ACE_Export
01728   int thr_setspecific_native (ACE_OS_thread_key_t key,
01729                               void *data);
01730 # endif 
01731 
01732   extern ACE_Export
01733   int thr_setspecific (ACE_thread_key_t key,
01734                        void *data);
01735 
01736   ACE_NAMESPACE_INLINE_FUNCTION
01737   int thr_sigsetmask (int how,
01738                       const sigset_t *nsm,
01739                       sigset_t *osm);
01740 
01741   ACE_NAMESPACE_INLINE_FUNCTION
01742   int thr_suspend (ACE_hthread_t target_thread);
01743 
01744   ACE_NAMESPACE_INLINE_FUNCTION
01745   void thr_testcancel (void);
01746 
01747   ACE_NAMESPACE_INLINE_FUNCTION
01748   void thr_yield (void);
01749 
01750 
01751 
01752   ACE_NAMESPACE_INLINE_FUNCTION
01753   int thread_mutex_destroy (ACE_thread_mutex_t *m);
01754 
01755   ACE_NAMESPACE_INLINE_FUNCTION
01756   int thread_mutex_init (ACE_thread_mutex_t *m,
01757                          int lock_type = 0,
01758                          const char *name = 0,
01759                          ACE_mutexattr_t *arg = 0);
01760 
01761 #if defined (ACE_HAS_WCHAR)
01762   ACE_NAMESPACE_INLINE_FUNCTION
01763   int thread_mutex_init (ACE_thread_mutex_t *m,
01764                          int lock_type,
01765                          const wchar_t *name,
01766                          ACE_mutexattr_t *arg = 0);
01767 #endif 
01768 
01769   ACE_NAMESPACE_INLINE_FUNCTION
01770   int thread_mutex_lock (ACE_thread_mutex_t *m);
01771 
01772   ACE_NAMESPACE_INLINE_FUNCTION
01773   int thread_mutex_lock (ACE_thread_mutex_t *m,
01774                          const ACE_Time_Value &timeout);
01775 
01776   ACE_NAMESPACE_INLINE_FUNCTION
01777   int thread_mutex_lock (ACE_thread_mutex_t *m,
01778                          const ACE_Time_Value *timeout);
01779 
01780   ACE_NAMESPACE_INLINE_FUNCTION
01781   int thread_mutex_trylock (ACE_thread_mutex_t *m);
01782 
01783   ACE_NAMESPACE_INLINE_FUNCTION
01784   int thread_mutex_unlock (ACE_thread_mutex_t *m);
01785 
01786 
01787 
01788 
01789 
01790 
01791 
01792 
01793 
01794 
01795 
01796   extern ACE_Export
01797   void unique_name (const void *object,
01798                     char *name,
01799                     size_t length);
01800 #if defined (ACE_USES_WCHAR)
01801   extern ACE_Export
01802   void unique_name (const void *object,
01803                     wchar_t *name,
01804                     size_t length);
01805 #endif 
01806 } 
01807 
01808 ACE_END_VERSIONED_NAMESPACE_DECL
01809 
01810 #if !defined (ACE_WIN32)
01811 
01812 extern "C"
01813 {
01814   typedef struct
01815   {
01816 #if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_CONDATTR_PSHARED)) || \
01817     (!defined (ACE_USES_FIFO_SEM) && \
01818       (!defined (ACE_HAS_POSIX_SEM) || !defined (ACE_HAS_POSIX_SEM_TIMEOUT) || defined (ACE_LACKS_NAMED_POSIX_SEM)))
01819 
01820     ACE_mutex_t lock_;
01821 
01822     ACE_cond_t condition_;
01823 #else
01824 # if (defined (ACE_HAS_PTHREADS) && defined (_POSIX_THREAD_PROCESS_SHARED) && !defined (ACE_LACKS_MUTEXATTR_PSHARED)) || \
01825      (!defined (ACE_USES_FIFO_SEM) && (!defined (ACE_HAS_POSIX_SEM) || defined (ACE_LACKS_NAMED_POSIX_SEM)))
01826 
01827     ACE_mutex_t lock_;
01828 # endif
01829 #endif
01830 
01831 
01832     int type_;
01833 
01834 
01835     int manual_reset_;
01836 
01837 
01838     int is_signaled_;
01839 
01840 
01841 
01842 
01843 
01844 
01845 
01846 
01847 
01848     bool auto_event_signaled_;
01849 
01850 
01851     unsigned long waiting_threads_;
01852 
01853 
01854     unsigned long signal_count_;
01855   } ACE_eventdata_t;
01856 }
01857 
01858 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
01859 
01860 
01861 
01862 
01863 
01864 
01865 class ACE_Export ACE_event_t
01866 {
01867   friend int ACE_OS::event_init(ACE_event_t*, int, int, int, const char*, void*,int);
01868   friend int ACE_OS::event_destroy(ACE_event_t*);
01869   friend int ACE_OS::event_wait(ACE_event_t*);
01870   friend int ACE_OS::event_timedwait(ACE_event_t*, ACE_Time_Value*, int);
01871   friend int ACE_OS::event_signal(ACE_event_t*);
01872   friend int ACE_OS::event_pulse(ACE_event_t*);
01873   friend int ACE_OS::event_reset(ACE_event_t*);
01874 protected:
01875 
01876 
01877   char* name_;
01878 
01879 
01880   ACE_eventdata_t* eventdata_;
01881 
01882 #if (!defined (ACE_HAS_PTHREADS) || !defined (_POSIX_THREAD_PROCESS_SHARED) || defined (ACE_LACKS_CONDATTR_PSHARED)) && \
01883   (defined (ACE_USES_FIFO_SEM) || \
01884     (defined (ACE_HAS_POSIX_SEM) && defined (ACE_HAS_POSIX_SEM_TIMEOUT) && !defined (ACE_LACKS_NAMED_POSIX_SEM)))
01885 
01886   ACE_sema_t semaphore_;
01887 
01888 # if (!defined (ACE_HAS_PTHREADS) || !defined (_POSIX_THREAD_PROCESS_SHARED) || defined (ACE_LACKS_MUTEXATTR_PSHARED)) && \
01889      (defined (ACE_USES_FIFO_SEM) || (defined (ACE_HAS_POSIX_SEM) && !defined (ACE_LACKS_NAMED_POSIX_SEM)))
01890 
01891   ACE_sema_t lock_;
01892 # endif
01893 #endif
01894 };
01895 
01896 ACE_END_VERSIONED_NAMESPACE_DECL
01897 
01898 #endif 
01899 
01900 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
01901 
01902 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
01903 
01904 
01905 
01906 
01907 
01908 
01909 
01910 
01911 
01912 
01913 
01914 
01915 
01916 
01917 
01918 
01919 
01920 
01921 
01922 class ACE_OS_Thread_Mutex_Guard
01923 {
01924 public:
01925 
01926   ACE_OS_Thread_Mutex_Guard (ACE_thread_mutex_t &m);
01927 
01928 
01929   ~ACE_OS_Thread_Mutex_Guard (void);
01930 
01931 
01932   int acquire (void);
01933 
01934 
01935   int release (void);
01936 
01937 protected:
01938 
01939   ACE_thread_mutex_t &lock_;
01940 
01941 
01942   int owner_;
01943 
01944   
01945   ACE_OS_Thread_Mutex_Guard &operator= (const ACE_OS_Thread_Mutex_Guard &);
01946   ACE_OS_Thread_Mutex_Guard (const ACE_OS_Thread_Mutex_Guard &);
01947 };
01948 
01949 
01950 
01951 
01952 
01953 
01954 
01955 
01956 
01957 
01958 
01959 
01960 
01961 
01962 
01963 
01964 
01965 
01966 
01967 class ACE_OS_Recursive_Thread_Mutex_Guard
01968 {
01969 public:
01970 
01971   ACE_OS_Recursive_Thread_Mutex_Guard (ACE_recursive_thread_mutex_t &m);
01972 
01973 
01974   ~ACE_OS_Recursive_Thread_Mutex_Guard (void);
01975 
01976 
01977   int acquire (void);
01978 
01979 
01980   int release (void);
01981 
01982 protected:
01983 
01984   ACE_recursive_thread_mutex_t &lock_;
01985 
01986 
01987   int owner_;
01988 
01989   
01990   ACE_OS_Recursive_Thread_Mutex_Guard &operator= (
01991     const ACE_OS_Recursive_Thread_Mutex_Guard &);
01992   ACE_OS_Recursive_Thread_Mutex_Guard (
01993     const ACE_OS_Recursive_Thread_Mutex_Guard &);
01994 };
01995 
01996 ACE_END_VERSIONED_NAMESPACE_DECL
01997 
01998 
01999 # define ACE_OS_GUARD \
02000   ACE_OS_Thread_Mutex_Guard ace_os_guard__ (*(ACE_thread_mutex_t *) \
02001     ACE_OS_Object_Manager::preallocated_object[ \
02002       ACE_OS_Object_Manager::ACE_OS_MONITOR_LOCK]);
02003 
02004 
02005 # define ACE_TSS_CLEANUP_GUARD \
02006   ACE_OS_Recursive_Thread_Mutex_Guard ace_tss_cleanup_guard__ (*(ACE_recursive_thread_mutex_t *) \
02007     ACE_OS_Object_Manager::preallocated_object[ \
02008       ACE_OS_Object_Manager::ACE_TSS_CLEANUP_LOCK]);
02009 
02010 
02011 # define ACE_TSS_BASE_GUARD \
02012   ACE_OS_Recursive_Thread_Mutex_Guard ace_tss_base_guard__ (*(ACE_recursive_thread_mutex_t *) \
02013     ACE_OS_Object_Manager::preallocated_object[ \
02014       ACE_OS_Object_Manager::ACE_TSS_BASE_LOCK]);
02015 
02016 #else  
02017 # define ACE_OS_GUARD
02018 # define ACE_TSS_CLEANUP_GUARD
02019 # define ACE_TSS_BASE_GUARD
02020 #endif 
02021 
02022 # if defined (ACE_HAS_INLINED_OSCALLS)
02023 #   if defined (ACE_INLINE)
02024 #     undef ACE_INLINE
02025 #   endif 
02026 #   define ACE_INLINE inline
02027 #   include "ace/OS_NS_Thread.inl"
02028 # endif 
02029 
02030 # include  "ace/post.h"
02031 #endif