X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=thread.h;h=9b7524586c6517a5f3e527e5115e2aa81b2d363d;hb=dcb4812c733545a68ef39b77c2dc4f7d440de203;hp=b6397cbfddb0b843c6c1d8b33dfc03e4993013ae;hpb=d4cce5f1785350c29a181d4bbaaa3141c6fdbe1e;p=p5sagit%2Fp5-mst-13.2.git diff --git a/thread.h b/thread.h index b6397cb..9b75245 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,15 +21,27 @@ 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 -#ifndef YIELD -# ifdef HAS_PTHREAD_YIELD -# define YIELD pthread_yield() +#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_SCHED_YIELD # define YIELD sched_yield() +# else +# ifdef HAS_PTHREAD_YIELD +# define YIELD pthread_yield() +# endif # endif #endif @@ -120,8 +132,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 +152,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 * @@ -181,8 +221,14 @@ 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 */ +#ifdef WIN32 +#define dTHR extern int Perl___notused +#else #define dTHR extern int errno +#endif #endif /* USE_THREADS */