diff options
author | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1998-02-02 15:51:39 +0000 |
---|---|---|
committer | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1998-02-02 15:51:39 +0000 |
commit | 940cb80d04d066d4fedfc4486ab57e435ee74514 (patch) | |
tree | 29bcb5cc4d0e30eb584990d09b0ee5b2ad73cc49 /thread.h | |
parent | 5330fa38cab061dceb2210e65e8eccfafbebc694 (diff) | |
download | perl-940cb80d04d066d4fedfc4486ab57e435ee74514.tar.gz |
Introduced thr->threadsvp and THREADSV() for faster per-thread
variables. Moved threadnum to a per-interpreter variable and
made dTHR and lock/unlock of sv_mutex bypass the get/lock unless
more than one thread may be running. Minor tweaks to Thread.xs.
p4raw-id: //depot/perl@453
Diffstat (limited to 'thread.h')
-rw-r--r-- | thread.h | 41 |
1 files changed, 39 insertions, 2 deletions
@@ -20,10 +20,19 @@ #else # define pthread_mutexattr_default NULL # define pthread_condattr_default NULL -# define pthread_attr_default NULL #endif /* OLD_PTHREADS_API */ #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 # define YIELD pthread_yield() @@ -119,8 +128,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 @@ -131,6 +148,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 * |