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