summaryrefslogtreecommitdiff
path: root/thread.h
diff options
context:
space:
mode:
authorMalcolm Beattie <mbeattie@sable.ox.ac.uk>1998-02-02 15:51:39 +0000
committerMalcolm Beattie <mbeattie@sable.ox.ac.uk>1998-02-02 15:51:39 +0000
commit940cb80d04d066d4fedfc4486ab57e435ee74514 (patch)
tree29bcb5cc4d0e30eb584990d09b0ee5b2ad73cc49 /thread.h
parent5330fa38cab061dceb2210e65e8eccfafbebc694 (diff)
downloadperl-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.h41
1 files changed, 39 insertions, 2 deletions
diff --git a/thread.h b/thread.h
index 2328f7ed82..1b1ddf98be 100644
--- a/thread.h
+++ b/thread.h
@@ -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 *