[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 /* thread.h 2 * 3 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 4 * by Larry Wall and others 5 * 6 * You may distribute under the terms of either the GNU General Public 7 * License or the Artistic License, as specified in the README file. 8 * 9 */ 10 11 #if defined(USE_ITHREADS) 12 13 #if defined(VMS) 14 #include <builtins.h> 15 #endif 16 17 #ifdef WIN32 18 # include <win32thread.h> 19 #else 20 #ifdef NETWARE 21 # include <nw5thread.h> 22 #else 23 # ifdef OLD_PTHREADS_API /* Here be dragons. */ 24 # define DETACH(t) \ 25 STMT_START { \ 26 int _eC_; \ 27 if ((_eC_ = pthread_detach(&(t)->self))) { \ 28 MUTEX_UNLOCK(&(t)->mutex); \ 29 Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]", \ 30 _eC_, __FILE__, __LINE__); \ 31 } \ 32 } STMT_END 33 34 # define PERL_GET_CONTEXT Perl_get_context() 35 # define PERL_SET_CONTEXT(t) Perl_set_context((void*)t) 36 37 # define PTHREAD_GETSPECIFIC_INT 38 # ifdef DJGPP 39 # define pthread_addr_t any_t 40 # define NEED_PTHREAD_INIT 41 # define PTHREAD_CREATE_JOINABLE (1) 42 # endif 43 # ifdef __OPEN_VM 44 # define pthread_addr_t void * 45 # endif 46 # ifdef OEMVS 47 # define pthread_addr_t void * 48 # define pthread_create(t,a,s,d) pthread_create(t,&(a),s,d) 49 # define pthread_keycreate pthread_key_create 50 # endif 51 # ifdef VMS 52 # define pthread_attr_init(a) pthread_attr_create(a) 53 # define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_setdetach_np(a,s) 54 # define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d) 55 # define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d)) 56 # define pthread_mutexattr_init(a) pthread_mutexattr_create(a) 57 # define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t) 58 # endif 59 # if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020 60 # define pthread_attr_init(a) pthread_attr_create(a) 61 /* XXX pthread_setdetach_np() missing in DCE threads on HP-UX 10.20 */ 62 # define PTHREAD_ATTR_SETDETACHSTATE(a,s) (0) 63 # define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d) 64 # define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d)) 65 # define pthread_mutexattr_init(a) pthread_mutexattr_create(a) 66 # define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t) 67 # endif 68 # if defined(DJGPP) || defined(__OPEN_VM) || defined(OEMVS) 69 # define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,&(s)) 70 # define YIELD pthread_yield(NULL) 71 # endif 72 # endif 73 # if !defined(__hpux) || !defined(__ux_version) || __ux_version > 1020 74 # define pthread_mutexattr_default NULL 75 # define pthread_condattr_default NULL 76 # endif 77 #endif /* NETWARE */ 78 #endif 79 80 #ifndef PTHREAD_CREATE 81 /* You are not supposed to pass NULL as the 2nd arg of PTHREAD_CREATE(). */ 82 # define PTHREAD_CREATE(t,a,s,d) pthread_create(t,&(a),s,d) 83 #endif 84 85 #ifndef PTHREAD_ATTR_SETDETACHSTATE 86 # define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s) 87 #endif 88 89 #ifndef PTHREAD_CREATE_JOINABLE 90 # ifdef OLD_PTHREAD_CREATE_JOINABLE 91 # define PTHREAD_CREATE_JOINABLE OLD_PTHREAD_CREATE_JOINABLE 92 # else 93 # define PTHREAD_CREATE_JOINABLE 0 /* Panic? No, guess. */ 94 # endif 95 #endif 96 97 #ifdef DGUX 98 # define THREAD_CREATE_NEEDS_STACK (32*1024) 99 #endif 100 101 #ifdef __VMS 102 /* Default is 1024 on VAX, 8192 otherwise */ 103 # define THREAD_CREATE_NEEDS_STACK (32*1024) 104 #endif 105 106 #ifdef I_MACH_CTHREADS 107 108 /* cthreads interface */ 109 110 /* #include <mach/cthreads.h> is in perl.h #ifdef I_MACH_CTHREADS */ 111 112 #define MUTEX_INIT(m) \ 113 STMT_START { \ 114 *m = mutex_alloc(); \ 115 if (*m) { \ 116 mutex_init(*m); \ 117 } else { \ 118 Perl_croak_nocontext("panic: MUTEX_INIT [%s:%d]", \ 119 __FILE__, __LINE__); \ 120 } \ 121 } STMT_END 122 123 #define MUTEX_LOCK(m) mutex_lock(*m) 124 #define MUTEX_UNLOCK(m) mutex_unlock(*m) 125 #define MUTEX_DESTROY(m) \ 126 STMT_START { \ 127 mutex_free(*m); \ 128 *m = 0; \ 129 } STMT_END 130 131 #define COND_INIT(c) \ 132 STMT_START { \ 133 *c = condition_alloc(); \ 134 if (*c) { \ 135 condition_init(*c); \ 136 } \ 137 else { \ 138 Perl_croak_nocontext("panic: COND_INIT [%s:%d]", \ 139 __FILE__, __LINE__); \ 140 } \ 141 } STMT_END 142 143 #define COND_SIGNAL(c) condition_signal(*c) 144 #define COND_BROADCAST(c) condition_broadcast(*c) 145 #define COND_WAIT(c, m) condition_wait(*c, *m) 146 #define COND_DESTROY(c) \ 147 STMT_START { \ 148 condition_free(*c); \ 149 *c = 0; \ 150 } STMT_END 151 152 #define THREAD_CREATE(thr, f) (thr->self = cthread_fork(f, thr), 0) 153 #define THREAD_POST_CREATE(thr) 154 155 #define THREAD_RET_TYPE any_t 156 #define THREAD_RET_CAST(x) ((any_t) x) 157 158 #define DETACH(t) cthread_detach(t->self) 159 #define JOIN(t, avp) (*(avp) = (AV *)cthread_join(t->self)) 160 161 #define PERL_SET_CONTEXT(t) cthread_set_data(cthread_self(), t) 162 #define PERL_GET_CONTEXT cthread_data(cthread_self()) 163 164 #define INIT_THREADS cthread_init() 165 #define YIELD cthread_yield() 166 #define ALLOC_THREAD_KEY NOOP 167 #define FREE_THREAD_KEY NOOP 168 #define SET_THREAD_SELF(thr) (thr->self = cthread_self()) 169 170 #endif /* I_MACH_CTHREADS */ 171 172 #ifndef YIELD 173 # ifdef SCHED_YIELD 174 # define YIELD SCHED_YIELD 175 # else 176 # ifdef HAS_SCHED_YIELD 177 # define YIELD sched_yield() 178 # else 179 # ifdef HAS_PTHREAD_YIELD 180 /* pthread_yield(NULL) platforms are expected 181 * to have #defined YIELD for themselves. */ 182 # define YIELD pthread_yield() 183 # endif 184 # endif 185 # endif 186 #endif 187 188 #ifdef __hpux 189 # define MUTEX_INIT_NEEDS_MUTEX_ZEROED 190 #endif 191 192 #ifndef MUTEX_INIT 193 194 # ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED 195 /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */ 196 # define MUTEX_INIT(m) \ 197 STMT_START { \ 198 int _eC_; \ 199 Zero((m), 1, perl_mutex); \ 200 if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \ 201 Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ 202 _eC_, __FILE__, __LINE__); \ 203 } STMT_END 204 # else 205 # define MUTEX_INIT(m) \ 206 STMT_START { \ 207 int _eC_; \ 208 if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \ 209 Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ 210 _eC_, __FILE__, __LINE__); \ 211 } STMT_END 212 # endif 213 214 # define MUTEX_LOCK(m) \ 215 STMT_START { \ 216 int _eC_; \ 217 if ((_eC_ = pthread_mutex_lock((m)))) \ 218 Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]", \ 219 _eC_, __FILE__, __LINE__); \ 220 } STMT_END 221 222 # define MUTEX_UNLOCK(m) \ 223 STMT_START { \ 224 int _eC_; \ 225 if ((_eC_ = pthread_mutex_unlock((m)))) \ 226 Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]", \ 227 _eC_, __FILE__, __LINE__); \ 228 } STMT_END 229 230 # define MUTEX_DESTROY(m) \ 231 STMT_START { \ 232 int _eC_; \ 233 if ((_eC_ = pthread_mutex_destroy((m)))) \ 234 Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]", \ 235 _eC_, __FILE__, __LINE__); \ 236 } STMT_END 237 #endif /* MUTEX_INIT */ 238 239 #ifndef COND_INIT 240 # define COND_INIT(c) \ 241 STMT_START { \ 242 int _eC_; \ 243 if ((_eC_ = pthread_cond_init((c), pthread_condattr_default))) \ 244 Perl_croak_nocontext("panic: COND_INIT (%d) [%s:%d]", \ 245 _eC_, __FILE__, __LINE__); \ 246 } STMT_END 247 248 # define COND_SIGNAL(c) \ 249 STMT_START { \ 250 int _eC_; \ 251 if ((_eC_ = pthread_cond_signal((c)))) \ 252 Perl_croak_nocontext("panic: COND_SIGNAL (%d) [%s:%d]", \ 253 _eC_, __FILE__, __LINE__); \ 254 } STMT_END 255 256 # define COND_BROADCAST(c) \ 257 STMT_START { \ 258 int _eC_; \ 259 if ((_eC_ = pthread_cond_broadcast((c)))) \ 260 Perl_croak_nocontext("panic: COND_BROADCAST (%d) [%s:%d]", \ 261 _eC_, __FILE__, __LINE__); \ 262 } STMT_END 263 264 # define COND_WAIT(c, m) \ 265 STMT_START { \ 266 int _eC_; \ 267 if ((_eC_ = pthread_cond_wait((c), (m)))) \ 268 Perl_croak_nocontext("panic: COND_WAIT (%d) [%s:%d]", \ 269 _eC_, __FILE__, __LINE__); \ 270 } STMT_END 271 272 # define COND_DESTROY(c) \ 273 STMT_START { \ 274 int _eC_; \ 275 if ((_eC_ = pthread_cond_destroy((c)))) \ 276 Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]", \ 277 _eC_, __FILE__, __LINE__); \ 278 } STMT_END 279 #endif /* COND_INIT */ 280 281 /* DETACH(t) must only be called while holding t->mutex */ 282 #ifndef DETACH 283 # define DETACH(t) \ 284 STMT_START { \ 285 int _eC_; \ 286 if ((_eC_ = pthread_detach((t)->self))) { \ 287 MUTEX_UNLOCK(&(t)->mutex); \ 288 Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]", \ 289 _eC_, __FILE__, __LINE__); \ 290 } \ 291 } STMT_END 292 #endif /* DETACH */ 293 294 #ifndef JOIN 295 # define JOIN(t, avp) \ 296 STMT_START { \ 297 int _eC_; \ 298 if ((_eC_ = pthread_join((t)->self, (void**)(avp)))) \ 299 Perl_croak_nocontext("panic: pthread_join (%d) [%s:%d]", \ 300 _eC_, __FILE__, __LINE__); \ 301 } STMT_END 302 #endif /* JOIN */ 303 304 /* Use an unchecked fetch of thread-specific data instead of a checked one. 305 * It would fail if the key were bogus, but if the key were bogus then 306 * Really Bad Things would be happening anyway. --dan */ 307 #if (defined(__ALPHA) && (__VMS_VER >= 70000000)) || \ 308 (defined(__alpha) && defined(__osf__) && !defined(__GNUC__)) /* Available only on >= 4.0 */ 309 # define HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP /* Configure test needed */ 310 #endif 311 312 #ifdef HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP 313 # define PTHREAD_GETSPECIFIC(key) pthread_unchecked_getspecific_np(key) 314 #else 315 # define PTHREAD_GETSPECIFIC(key) pthread_getspecific(key) 316 #endif 317 318 #ifndef PERL_GET_CONTEXT 319 # define PERL_GET_CONTEXT PTHREAD_GETSPECIFIC(PL_thr_key) 320 #endif 321 322 #ifndef PERL_SET_CONTEXT 323 # define PERL_SET_CONTEXT(t) \ 324 STMT_START { \ 325 int _eC_; \ 326 if ((_eC_ = pthread_setspecific(PL_thr_key, (void *)(t)))) \ 327 Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]", \ 328 _eC_, __FILE__, __LINE__); \ 329 } STMT_END 330 #endif /* PERL_SET_CONTEXT */ 331 332 #ifndef INIT_THREADS 333 # ifdef NEED_PTHREAD_INIT 334 # define INIT_THREADS pthread_init() 335 # endif 336 #endif 337 338 #ifndef ALLOC_THREAD_KEY 339 # define ALLOC_THREAD_KEY \ 340 STMT_START { \ 341 if (pthread_key_create(&PL_thr_key, 0)) { \ 342 write(2, STR_WITH_LEN("panic: pthread_key_create failed\n")); \ 343 exit(1); \ 344 } \ 345 } STMT_END 346 #endif 347 348 #ifndef FREE_THREAD_KEY 349 # define FREE_THREAD_KEY \ 350 STMT_START { \ 351 pthread_key_delete(PL_thr_key); \ 352 } STMT_END 353 #endif 354 355 #ifndef PTHREAD_ATFORK 356 # ifdef HAS_PTHREAD_ATFORK 357 # define PTHREAD_ATFORK(prepare,parent,child) \ 358 pthread_atfork(prepare,parent,child) 359 # else 360 # define PTHREAD_ATFORK(prepare,parent,child) \ 361 NOOP 362 # endif 363 #endif 364 365 #ifndef THREAD_RET_TYPE 366 # define THREAD_RET_TYPE void * 367 # define THREAD_RET_CAST(p) ((void *)(p)) 368 #endif /* THREAD_RET */ 369 370 # define LOCK_DOLLARZERO_MUTEX MUTEX_LOCK(&PL_dollarzero_mutex) 371 # define UNLOCK_DOLLARZERO_MUTEX MUTEX_UNLOCK(&PL_dollarzero_mutex) 372 373 #endif /* USE_ITHREADS */ 374 375 #ifndef MUTEX_LOCK 376 # define MUTEX_LOCK(m) 377 #endif 378 379 #ifndef MUTEX_UNLOCK 380 # define MUTEX_UNLOCK(m) 381 #endif 382 383 #ifndef MUTEX_INIT 384 # define MUTEX_INIT(m) 385 #endif 386 387 #ifndef MUTEX_DESTROY 388 # define MUTEX_DESTROY(m) 389 #endif 390 391 #ifndef COND_INIT 392 # define COND_INIT(c) 393 #endif 394 395 #ifndef COND_SIGNAL 396 # define COND_SIGNAL(c) 397 #endif 398 399 #ifndef COND_BROADCAST 400 # define COND_BROADCAST(c) 401 #endif 402 403 #ifndef COND_WAIT 404 # define COND_WAIT(c, m) 405 #endif 406 407 #ifndef COND_DESTROY 408 # define COND_DESTROY(c) 409 #endif 410 411 #ifndef LOCK_SV_MUTEX 412 # define LOCK_SV_MUTEX 413 #endif 414 415 #ifndef UNLOCK_SV_MUTEX 416 # define UNLOCK_SV_MUTEX 417 #endif 418 419 #ifndef LOCK_STRTAB_MUTEX 420 # define LOCK_STRTAB_MUTEX 421 #endif 422 423 #ifndef UNLOCK_STRTAB_MUTEX 424 # define UNLOCK_STRTAB_MUTEX 425 #endif 426 427 #ifndef LOCK_CRED_MUTEX 428 # define LOCK_CRED_MUTEX 429 #endif 430 431 #ifndef UNLOCK_CRED_MUTEX 432 # define UNLOCK_CRED_MUTEX 433 #endif 434 435 #ifndef LOCK_FDPID_MUTEX 436 # define LOCK_FDPID_MUTEX 437 #endif 438 439 #ifndef UNLOCK_FDPID_MUTEX 440 # define UNLOCK_FDPID_MUTEX 441 #endif 442 443 #ifndef LOCK_SV_LOCK_MUTEX 444 # define LOCK_SV_LOCK_MUTEX 445 #endif 446 447 #ifndef UNLOCK_SV_LOCK_MUTEX 448 # define UNLOCK_SV_LOCK_MUTEX 449 #endif 450 451 #ifndef LOCK_DOLLARZERO_MUTEX 452 # define LOCK_DOLLARZERO_MUTEX 453 #endif 454 455 #ifndef UNLOCK_DOLLARZERO_MUTEX 456 # define UNLOCK_DOLLARZERO_MUTEX 457 #endif 458 459 /* THR, SET_THR, and dTHR are there for compatibility with old versions */ 460 #ifndef THR 461 # define THR PERL_GET_THX 462 #endif 463 464 #ifndef SET_THR 465 # define SET_THR(t) PERL_SET_THX(t) 466 #endif 467 468 #ifndef dTHR 469 # define dTHR dNOOP 470 #endif 471 472 #ifndef INIT_THREADS 473 # define INIT_THREADS NOOP 474 #endif
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |