X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=thread.h;h=f09143d1eb35d369d1b2b1bb3c446b89657455a5;hb=a27f85b3b5aa22c0f009ddabe35728717aaebf3d;hp=9e607e0c003b00f4152cd73dd689cb947746fb92;hpb=7f3d1cf17f00f843a4ab0c805e58fa10c222716a;p=p5sagit%2Fp5-mst-13.2.git diff --git a/thread.h b/thread.h index 9e607e0..f09143d 100644 --- a/thread.h +++ b/thread.h @@ -8,11 +8,11 @@ STMT_START { \ if (pthread_detach(&(t)->self)) { \ MUTEX_UNLOCK(&(t)->mutex); \ - croak("panic: DETACH"); \ + Perl_croak(aTHX_ "panic: DETACH"); \ } \ } STMT_END # define THR getTHR() -struct perl_thread *getTHR _((void)); +struct perl_thread *getTHR (void); # define PTHREAD_GETSPECIFIC_INT # ifdef DJGPP # define pthread_addr_t any_t @@ -35,10 +35,8 @@ struct perl_thread *getTHR _((void)); # define YIELD pthread_yield(NULL) # endif # endif -# ifndef VMS # define pthread_mutexattr_default NULL # define pthread_condattr_default NULL -# endif #endif #ifndef PTHREAD_CREATE @@ -50,6 +48,14 @@ struct perl_thread *getTHR _((void)); # define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s) #endif +#ifndef PTHREAD_CREATE_JOINABLE +# ifdef OLD_PTHREAD_CREATE_JOINABLE +# define PTHREAD_CREATE_JOINABLE OLD_PTHREAD_CREATE_JOINABLE +# else +# define PTHREAD_CREATE_JOINABLE 0 /* Panic? No, guess. */ +# endif +#endif + #ifdef I_MACH_CTHREADS /* cthreads interface */ @@ -62,7 +68,7 @@ struct perl_thread *getTHR _((void)); if (*m) { \ mutex_init(*m); \ } else { \ - croak("panic: MUTEX_INIT"); \ + Perl_croak(aTHX_ "panic: MUTEX_INIT"); \ } \ } STMT_END @@ -80,7 +86,7 @@ struct perl_thread *getTHR _((void)); if (*c) { \ condition_init(*c); \ } else { \ - croak("panic: COND_INIT"); \ + Perl_croak(aTHX_ "panic: COND_INIT"); \ } \ } STMT_END @@ -128,38 +134,50 @@ struct perl_thread *getTHR _((void)); # endif #endif -#ifdef PTHREADS_CREATED_JOINABLE -# define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE -#else -# ifdef PTHREAD_CREATE_UNDETACHED -# define ATTR_JOINABLE PTHREAD_CREATE_UNDETACHED -# else -# ifdef __UNDETACHED -# define ATTR_JOINABLE __UNDETACHED -# endif -# endif +#ifdef __hpux +# define MUTEX_INIT_NEEDS_MUTEX_ZEROED #endif #ifndef MUTEX_INIT +#ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED + /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */ +#define MUTEX_INIT(m) \ + STMT_START { \ + Zero((m), 1, perl_mutex); \ + if (pthread_mutex_init((m), pthread_mutexattr_default)) \ + Perl_croak(aTHX_ "panic: MUTEX_INIT"); \ + } STMT_END +#else #define MUTEX_INIT(m) \ STMT_START { \ if (pthread_mutex_init((m), pthread_mutexattr_default)) \ - croak("panic: MUTEX_INIT"); \ + Perl_croak(aTHX_ "panic: MUTEX_INIT"); \ } STMT_END +#endif #define MUTEX_LOCK(m) \ STMT_START { \ if (pthread_mutex_lock((m))) \ - croak("panic: MUTEX_LOCK"); \ + Perl_croak(aTHX_ "panic: MUTEX_LOCK"); \ } STMT_END #define MUTEX_UNLOCK(m) \ STMT_START { \ if (pthread_mutex_unlock((m))) \ - croak("panic: MUTEX_UNLOCK"); \ + Perl_croak(aTHX_ "panic: MUTEX_UNLOCK"); \ + } STMT_END +#define MUTEX_LOCK_NOCONTEXT(m) \ + STMT_START { \ + if (pthread_mutex_lock((m))) \ + Perl_croak_nocontext("panic: MUTEX_LOCK"); \ + } STMT_END +#define MUTEX_UNLOCK_NOCONTEXT(m) \ + STMT_START { \ + if (pthread_mutex_unlock((m))) \ + Perl_croak_nocontext("panic: MUTEX_UNLOCK");\ } STMT_END #define MUTEX_DESTROY(m) \ STMT_START { \ if (pthread_mutex_destroy((m))) \ - croak("panic: MUTEX_DESTROY"); \ + Perl_croak(aTHX_ "panic: MUTEX_DESTROY"); \ } STMT_END #endif /* MUTEX_INIT */ @@ -167,27 +185,27 @@ struct perl_thread *getTHR _((void)); #define COND_INIT(c) \ STMT_START { \ if (pthread_cond_init((c), pthread_condattr_default)) \ - croak("panic: COND_INIT"); \ + Perl_croak(aTHX_ "panic: COND_INIT"); \ } STMT_END #define COND_SIGNAL(c) \ STMT_START { \ if (pthread_cond_signal((c))) \ - croak("panic: COND_SIGNAL"); \ + Perl_croak(aTHX_ "panic: COND_SIGNAL"); \ } STMT_END #define COND_BROADCAST(c) \ STMT_START { \ if (pthread_cond_broadcast((c))) \ - croak("panic: COND_BROADCAST"); \ + Perl_croak(aTHX_ "panic: COND_BROADCAST"); \ } STMT_END #define COND_WAIT(c, m) \ STMT_START { \ if (pthread_cond_wait((c), (m))) \ - croak("panic: COND_WAIT"); \ + Perl_croak(aTHX_ "panic: COND_WAIT"); \ } STMT_END #define COND_DESTROY(c) \ STMT_START { \ if (pthread_cond_destroy((c))) \ - croak("panic: COND_DESTROY"); \ + Perl_croak(aTHX_ "panic: COND_DESTROY"); \ } STMT_END #endif /* COND_INIT */ @@ -197,7 +215,7 @@ struct perl_thread *getTHR _((void)); STMT_START { \ if (pthread_detach((t)->self)) { \ MUTEX_UNLOCK(&(t)->mutex); \ - croak("panic: DETACH"); \ + Perl_croak(aTHX_ "panic: DETACH"); \ } \ } STMT_END #endif /* DETACH */ @@ -206,7 +224,7 @@ struct perl_thread *getTHR _((void)); #define JOIN(t, avp) \ STMT_START { \ if (pthread_join((t)->self, (void**)(avp))) \ - croak("panic: pthread_join"); \ + Perl_croak(aTHX_ "panic: pthread_join"); \ } STMT_END #endif /* JOIN */ @@ -214,7 +232,7 @@ struct perl_thread *getTHR _((void)); #define SET_THR(t) \ STMT_START { \ if (pthread_setspecific(PL_thr_key, (void *) (t))) \ - croak("panic: pthread_setspecific"); \ + Perl_croak(aTHX_ "panic: pthread_setspecific"); \ } STMT_END #endif /* SET_THR */ @@ -228,6 +246,8 @@ struct perl_thread *getTHR _((void)); * from thrsv which is cached in the per-interpreter structure. * Systems with very fast pthread_get_specific (which should be all systems * but unfortunately isn't) may wish to simplify to "...*thr = THR". + * + * The use of PL_threadnum should be safe here. */ #ifndef dTHR # define dTHR \ @@ -250,30 +270,27 @@ struct perl_thread *getTHR _((void)); * try only locking them if there may be more than one thread in existence. * Systems with very fast mutexes (and/or slow conditionals) may wish to * remove the "if (threadnum) ..." test. + * XXX do NOT use C -- it sets up race conditions! */ #define LOCK_SV_MUTEX \ STMT_START { \ - if (PL_threadnum) \ - MUTEX_LOCK(&PL_sv_mutex); \ + MUTEX_LOCK(&PL_sv_mutex); \ } STMT_END #define UNLOCK_SV_MUTEX \ STMT_START { \ - if (PL_threadnum) \ - MUTEX_UNLOCK(&PL_sv_mutex); \ + MUTEX_UNLOCK(&PL_sv_mutex); \ } STMT_END /* Likewise for strtab_mutex */ #define LOCK_STRTAB_MUTEX \ STMT_START { \ - if (PL_threadnum) \ - MUTEX_LOCK(&PL_strtab_mutex); \ + MUTEX_LOCK(&PL_strtab_mutex); \ } STMT_END #define UNLOCK_STRTAB_MUTEX \ STMT_START { \ - if (PL_threadnum) \ - MUTEX_UNLOCK(&PL_strtab_mutex); \ + MUTEX_UNLOCK(&PL_strtab_mutex); \ } STMT_END #ifndef THREAD_RET_TYPE @@ -316,7 +333,9 @@ typedef struct condpair { #else /* USE_THREADS is not defined */ #define MUTEX_LOCK(m) +#define MUTEX_LOCK_NOCONTEXT(m) #define MUTEX_UNLOCK(m) +#define MUTEX_UNLOCK_NOCONTEXT(m) #define MUTEX_INIT(m) #define MUTEX_DESTROY(m) #define COND_INIT(c) @@ -330,10 +349,5 @@ typedef struct condpair { #define UNLOCK_STRTAB_MUTEX #define THR -/* Rats: if dTHR is just blank then the subsequent ";" throws an error */ -#ifdef WIN32 -#define dTHR extern int Perl___notused -#else -#define dTHR extern int errno -#endif +#define dTHR dNOOP #endif /* USE_THREADS */