[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-unattended/var/se3/unattended/install/linuxaux/opt/perl/lib/5.10.0/i586-linux-thread-multi/CORE/ -> thread.h (source)

   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


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1