X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/00676b7421b69e6202c7fa5b037e88ed62a1dee3..6daeaaa3123e456674380042544721b5f7a41f69:/thread.h diff --git a/thread.h b/thread.h index 00e4d76..9958a5b 100644 --- a/thread.h +++ b/thread.h @@ -1,6 +1,7 @@ /* thread.h * - * Copyright (C) 1999, 2000, 2001, 2002, by Larry Wall and others + * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + * by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -22,9 +23,11 @@ # ifdef OLD_PTHREADS_API /* Here be dragons. */ # define DETACH(t) \ STMT_START { \ - if (pthread_detach(&(t)->self)) { \ + int _eC_; \ + if ((_eC_ = pthread_detach(&(t)->self))) { \ MUTEX_UNLOCK(&(t)->mutex); \ - Perl_croak_nocontext("panic: DETACH"); \ + Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } \ } STMT_END @@ -37,9 +40,6 @@ # define NEED_PTHREAD_INIT # define PTHREAD_CREATE_JOINABLE (1) # endif -# ifdef __OPEN_VM -# define pthread_addr_t void * -# endif # ifdef OEMVS # define pthread_addr_t void * # define pthread_create(t,a,s,d) pthread_create(t,&(a),s,d) @@ -62,7 +62,7 @@ # define pthread_mutexattr_init(a) pthread_mutexattr_create(a) # define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t) # endif -# if defined(DJGPP) || defined(__OPEN_VM) || defined(OEMVS) +# if defined(DJGPP) || defined(OEMVS) # define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,&(s)) # define YIELD pthread_yield(NULL) # endif @@ -91,8 +91,13 @@ # endif #endif -#ifdef DGUX -# define THREAD_CREATE_NEEDS_STACK (32*1024) +#ifdef __VMS + /* Default is 1024 on VAX, 8192 otherwise */ +# ifdef __ia64 +# define THREAD_CREATE_NEEDS_STACK (48*1024) +# else +# define THREAD_CREATE_NEEDS_STACK (32*1024) +# endif #endif #ifdef I_MACH_CTHREADS @@ -107,7 +112,8 @@ if (*m) { \ mutex_init(*m); \ } else { \ - Perl_croak_nocontext("panic: MUTEX_INIT"); \ + Perl_croak_nocontext("panic: MUTEX_INIT [%s:%d]", \ + __FILE__, __LINE__); \ } \ } STMT_END @@ -126,7 +132,8 @@ condition_init(*c); \ } \ else { \ - Perl_croak_nocontext("panic: COND_INIT"); \ + Perl_croak_nocontext("panic: COND_INIT [%s:%d]", \ + __FILE__, __LINE__); \ } \ } STMT_END @@ -146,7 +153,7 @@ #define THREAD_RET_CAST(x) ((any_t) x) #define DETACH(t) cthread_detach(t->self) -#define JOIN(t, avp) (*(avp) = (AV *)cthread_join(t->self)) +#define JOIN(t, avp) (*(avp) = MUTABLE_AV(cthread_join(t->self))) #define PERL_SET_CONTEXT(t) cthread_set_data(cthread_self(), t) #define PERL_GET_CONTEXT cthread_data(cthread_self()) @@ -185,66 +192,94 @@ /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */ # define MUTEX_INIT(m) \ STMT_START { \ + int _eC_; \ Zero((m), 1, perl_mutex); \ - if (pthread_mutex_init((m), pthread_mutexattr_default)) \ - Perl_croak_nocontext("panic: MUTEX_INIT"); \ + if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \ + Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # else # define MUTEX_INIT(m) \ STMT_START { \ - if (pthread_mutex_init((m), pthread_mutexattr_default)) \ - Perl_croak_nocontext("panic: MUTEX_INIT"); \ + int _eC_; \ + if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \ + Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # endif +# ifdef PERL_TSA_ACTIVE +# define perl_pthread_mutex_lock(m) perl_tsa_mutex_lock(m) +# define perl_pthread_mutex_unlock(m) perl_tsa_mutex_unlock(m) +# else +# define perl_pthread_mutex_lock(m) pthread_mutex_lock(m) +# define perl_pthread_mutex_unlock(m) pthread_mutex_unlock(m) +# endif + # define MUTEX_LOCK(m) \ STMT_START { \ - if (pthread_mutex_lock((m))) \ - Perl_croak_nocontext("panic: MUTEX_LOCK"); \ + int _eC_; \ + if ((_eC_ = perl_pthread_mutex_lock((m)))) \ + Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # define MUTEX_UNLOCK(m) \ STMT_START { \ - if (pthread_mutex_unlock((m))) \ - Perl_croak_nocontext("panic: MUTEX_UNLOCK"); \ + int _eC_; \ + if ((_eC_ = perl_pthread_mutex_unlock((m)))) \ + Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # define MUTEX_DESTROY(m) \ STMT_START { \ - if (pthread_mutex_destroy((m))) \ - Perl_croak_nocontext("panic: MUTEX_DESTROY"); \ + int _eC_; \ + if ((_eC_ = pthread_mutex_destroy((m)))) \ + Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END #endif /* MUTEX_INIT */ #ifndef COND_INIT # define COND_INIT(c) \ STMT_START { \ - if (pthread_cond_init((c), pthread_condattr_default)) \ - Perl_croak_nocontext("panic: COND_INIT"); \ + int _eC_; \ + if ((_eC_ = pthread_cond_init((c), pthread_condattr_default))) \ + Perl_croak_nocontext("panic: COND_INIT (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # define COND_SIGNAL(c) \ STMT_START { \ - if (pthread_cond_signal((c))) \ - Perl_croak_nocontext("panic: COND_SIGNAL"); \ + int _eC_; \ + if ((_eC_ = pthread_cond_signal((c)))) \ + Perl_croak_nocontext("panic: COND_SIGNAL (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # define COND_BROADCAST(c) \ STMT_START { \ - if (pthread_cond_broadcast((c))) \ - Perl_croak_nocontext("panic: COND_BROADCAST"); \ + int _eC_; \ + if ((_eC_ = pthread_cond_broadcast((c)))) \ + Perl_croak_nocontext("panic: COND_BROADCAST (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # define COND_WAIT(c, m) \ STMT_START { \ - if (pthread_cond_wait((c), (m))) \ - Perl_croak_nocontext("panic: COND_WAIT"); \ + int _eC_; \ + if ((_eC_ = pthread_cond_wait((c), (m)))) \ + Perl_croak_nocontext("panic: COND_WAIT (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # define COND_DESTROY(c) \ STMT_START { \ - if (pthread_cond_destroy((c))) \ - Perl_croak_nocontext("panic: COND_DESTROY"); \ + int _eC_; \ + if ((_eC_ = pthread_cond_destroy((c)))) \ + Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END #endif /* COND_INIT */ @@ -252,9 +287,11 @@ #ifndef DETACH # define DETACH(t) \ STMT_START { \ - if (pthread_detach((t)->self)) { \ + int _eC_; \ + if ((_eC_ = pthread_detach((t)->self))) { \ MUTEX_UNLOCK(&(t)->mutex); \ - Perl_croak_nocontext("panic: DETACH"); \ + Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } \ } STMT_END #endif /* DETACH */ @@ -262,8 +299,10 @@ #ifndef JOIN # define JOIN(t, avp) \ STMT_START { \ - if (pthread_join((t)->self, (void**)(avp))) \ - Perl_croak_nocontext("panic: pthread_join"); \ + int _eC_; \ + if ((_eC_ = pthread_join((t)->self, (void**)(avp)))) \ + Perl_croak_nocontext("panic: pthread_join (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END #endif /* JOIN */ @@ -288,8 +327,10 @@ #ifndef PERL_SET_CONTEXT # define PERL_SET_CONTEXT(t) \ STMT_START { \ - if (pthread_setspecific(PL_thr_key, (void *)(t))) \ - Perl_croak_nocontext("panic: pthread_setspecific"); \ + int _eC_; \ + if ((_eC_ = pthread_setspecific(PL_thr_key, (void *)(t)))) \ + Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END #endif /* PERL_SET_CONTEXT */ @@ -302,8 +343,8 @@ #ifndef ALLOC_THREAD_KEY # define ALLOC_THREAD_KEY \ STMT_START { \ - if (pthread_key_create(&PL_thr_key, 0)) { \ - PerlIO_printf(PerlIO_stderr(), "panic: pthread_key_create"); \ + if (pthread_key_create(&PL_thr_key, 0)) { \ + PERL_UNUSED_RESULT(write(2, STR_WITH_LEN("panic: pthread_key_create failed\n"))); \ exit(1); \ } \ } STMT_END @@ -372,46 +413,6 @@ # define COND_DESTROY(c) #endif -#ifndef LOCK_SV_MUTEX -# define LOCK_SV_MUTEX -#endif - -#ifndef UNLOCK_SV_MUTEX -# define UNLOCK_SV_MUTEX -#endif - -#ifndef LOCK_STRTAB_MUTEX -# define LOCK_STRTAB_MUTEX -#endif - -#ifndef UNLOCK_STRTAB_MUTEX -# define UNLOCK_STRTAB_MUTEX -#endif - -#ifndef LOCK_CRED_MUTEX -# define LOCK_CRED_MUTEX -#endif - -#ifndef UNLOCK_CRED_MUTEX -# define UNLOCK_CRED_MUTEX -#endif - -#ifndef LOCK_FDPID_MUTEX -# define LOCK_FDPID_MUTEX -#endif - -#ifndef UNLOCK_FDPID_MUTEX -# define UNLOCK_FDPID_MUTEX -#endif - -#ifndef LOCK_SV_LOCK_MUTEX -# define LOCK_SV_LOCK_MUTEX -#endif - -#ifndef UNLOCK_SV_LOCK_MUTEX -# define UNLOCK_SV_LOCK_MUTEX -#endif - #ifndef LOCK_DOLLARZERO_MUTEX # define LOCK_DOLLARZERO_MUTEX #endif @@ -436,3 +437,7 @@ #ifndef INIT_THREADS # define INIT_THREADS NOOP #endif + +/* + * ex: set ts=8 sts=4 sw=4 et: + */