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