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