X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=thread.h;h=a2522852f5283f02ec346b403aae87b6fb8d1b24;hb=13c6d55afa635942d3703ea1d73eb249186edfd4;hp=7e98c1d6e338b6b05487719bac95bc6623ff9437;hpb=49f531dad558d800dbb0a247178a2e50ad834fae;p=p5sagit%2Fp5-mst-13.2.git diff --git a/thread.h b/thread.h index 7e98c1d..a252285 100644 --- a/thread.h +++ b/thread.h @@ -4,8 +4,8 @@ # include #else +#ifndef DJGPP /* POSIXish threads */ -typedef pthread_t perl_os_thread; #ifdef OLD_PTHREADS_API # define pthread_mutexattr_init(a) pthread_mutexattr_create(a) # define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t) @@ -21,9 +21,19 @@ typedef pthread_t perl_os_thread; #else # define pthread_mutexattr_default NULL # define pthread_condattr_default NULL -# define pthread_attr_default NULL #endif /* OLD_PTHREADS_API */ #endif +#endif + +#ifdef PTHREADS_CREATED_JOINABLE +# define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE +#else +# ifdef PTHREAD_CREATE_UNDETACHED +# define ATTR_JOINABLE PTHREAD_CREATE_UNDETACHED +# else +# define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE +# endif +#endif #ifndef YIELD # ifdef HAS_PTHREAD_YIELD @@ -120,8 +130,16 @@ struct perl_thread *getTHR _((void)); # endif /* OLD_PTHREADS_API */ #endif /* THR */ +/* + * dTHR is performance-critical. Here, we only do the pthread_get_specific + * if there may be more than one thread in existence, otherwise we get thr + * 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". + */ #ifndef dTHR -# define dTHR struct perl_thread *thr = THR +# define dTHR \ + struct perl_thread *thr = threadnum? THR : (struct perl_thread*)SvPVX(thrsv) #endif /* dTHR */ #ifndef INIT_THREADS @@ -132,6 +150,26 @@ struct perl_thread *getTHR _((void)); # endif #endif +/* Accessor for per-thread SVs */ +#define THREADSV(i) (thr->threadsvp[i]) + +/* + * LOCK_SV_MUTEX and UNLOCK_SV_MUTEX are performance-critical. Here, we + * 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. + */ +#define LOCK_SV_MUTEX \ + STMT_START { \ + if (threadnum) \ + MUTEX_LOCK(&sv_mutex); \ + } STMT_END + +#define UNLOCK_SV_MUTEX \ + STMT_START { \ + if (threadnum) \ + MUTEX_UNLOCK(&sv_mutex); \ + } STMT_END #ifndef THREAD_RET_TYPE # define THREAD_RET_TYPE void * @@ -170,125 +208,6 @@ typedef struct condpair { #define MgCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->cond) #define MgOWNER(mg) ((condpair_t *)(mg->mg_ptr))->owner -#undef stack_base -#undef stack_sp -#undef stack_max -#undef curstack -#undef mainstack -#undef markstack -#undef markstack_ptr -#undef markstack_max -#undef scopestack -#undef scopestack_ix -#undef scopestack_max -#undef savestack -#undef savestack_ix -#undef savestack_max -#undef retstack -#undef retstack_ix -#undef retstack_max -#undef curcop -#undef cxstack -#undef cxstack_ix -#undef cxstack_max -#undef defstash -#undef curstash -#undef tmps_stack -#undef tmps_floor -#undef tmps_ix -#undef tmps_max -#undef curpad -#undef Sv -#undef Xpv -#undef statbuf -#undef timesbuf -#undef tainted -#undef curpm -#undef nrs -#undef rs -#undef last_in_gv -#undef ofs -#undef ofslen -#undef defoutgv -#undef chopset -#undef formtarget -#undef bodytarget -#undef start_env -#undef toptarget -#undef top_env -#undef in_eval -#undef restartop -#undef delaymagic -#undef dirty -#undef localizing - -#define stack_base (thr->Tstack_base) -#define stack_sp (thr->Tstack_sp) -#define stack_max (thr->Tstack_max) -#ifdef OP_IN_REGISTER -#define opsave (thr->Topsave) -#else -#undef op -#define op (thr->Top) -#endif -#define curcop (thr->Tcurcop) -#define stack (thr->Tstack) -#define curstack (thr->Tcurstack) -#define mainstack (thr->Tmainstack) -#define markstack (thr->Tmarkstack) -#define markstack_ptr (thr->Tmarkstack_ptr) -#define markstack_max (thr->Tmarkstack_max) -#define scopestack (thr->Tscopestack) -#define scopestack_ix (thr->Tscopestack_ix) -#define scopestack_max (thr->Tscopestack_max) - -#define savestack (thr->Tsavestack) -#define savestack_ix (thr->Tsavestack_ix) -#define savestack_max (thr->Tsavestack_max) - -#define retstack (thr->Tretstack) -#define retstack_ix (thr->Tretstack_ix) -#define retstack_max (thr->Tretstack_max) - -#define cxstack (thr->Tcxstack) -#define cxstack_ix (thr->Tcxstack_ix) -#define cxstack_max (thr->Tcxstack_max) - -#define curpad (thr->Tcurpad) -#define Sv (thr->TSv) -#define Xpv (thr->TXpv) -#define statbuf (thr->Tstatbuf) -#define timesbuf (thr->Ttimesbuf) -#define tainted (thr->Ttainted) -#define tainted (thr->Ttainted) -#define curpm (thr->Tcurpm) -#define nrs (thr->Tnrs) -#define rs (thr->Trs) -#define last_in_gv (thr->Tlast_in_gv) -#define ofs (thr->Tofs) -#define ofslen (thr->Tofslen) -#define defoutgv (thr->Tdefoutgv) -#define chopset (thr->Tchopset) -#define formtarget (thr->Tformtarget) -#define bodytarget (thr->Tbodytarget) -#define toptarget (thr->Ttoptarget) -#define defstash (thr->Tdefstash) -#define curstash (thr->Tcurstash) - -#define tmps_stack (thr->Ttmps_stack) -#define tmps_ix (thr->Ttmps_ix) -#define tmps_floor (thr->Ttmps_floor) -#define tmps_max (thr->Ttmps_max) - -#define in_eval (thr->Tin_eval) -#define restartop (thr->Trestartop) -#define delaymagic (thr->Tdelaymagic) -#define dirty (thr->Tdirty) -#define localizing (thr->Tlocalizing) - -#define top_env (thr->Ttop_env) -#define start_env (thr->Tstart_env) - #else /* USE_THREADS is not defined */ #define MUTEX_LOCK(m) @@ -300,6 +219,8 @@ typedef struct condpair { #define COND_BROADCAST(c) #define COND_WAIT(c, m) #define COND_DESTROY(c) +#define LOCK_SV_MUTEX +#define UNLOCK_SV_MUTEX #define THR /* Rats: if dTHR is just blank then the subsequent ";" throws an error */