#ifdef WIN32
# include <win32thread.h>
#else
-
-#ifndef DJGPP
-/* POSIXish threads */
-#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)
-# define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
-# define YIELD pthread_yield()
-# define DETACH(t) \
+# ifdef OLD_PTHREADS_API /* Here be dragons. */
+# define DETACH(t) \
STMT_START { \
if (pthread_detach(&(t)->self)) { \
MUTEX_UNLOCK(&(t)->mutex); \
croak("panic: DETACH"); \
} \
} STMT_END
-#else
-# define pthread_mutexattr_default NULL
-# define pthread_condattr_default NULL
-#endif /* OLD_PTHREADS_API */
+# define THR getTHR()
+struct perl_thread *getTHR _((void));
+# define PTHREAD_GETSPECIFIC_INT
+# ifdef DJGPP
+# define pthread_addr_t any_t
+# define NEED_PTHREAD_INIT
+# define PTHREAD_CREATE_JOINABLE (1)
+# endif
+# ifdef __OPEN_VM
+# define pthread_addr_t void *
+# endif
+# ifdef VMS
+# define pthread_attr_init(a) pthread_attr_create(a)
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_setdetach_np(a,s)
+# define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
+# define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
+# define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
+# define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
+# endif
+# if defined(DJGPP) || defined(__OPEN_VM)
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,&(s))
+# define YIELD pthread_yield(NULL)
+# endif
+# endif
+# ifndef VMS
+# define pthread_mutexattr_default NULL
+# define pthread_condattr_default NULL
+# endif
#endif
+
+#ifndef PTHREAD_CREATE
+/* You are not supposed to pass NULL as the 2nd arg of PTHREAD_CREATE(). */
+# define PTHREAD_CREATE(t,a,s,d) pthread_create(t,&(a),s,d)
+#endif
+
+#ifndef PTHREAD_ATTR_SETDETACHSTATE
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s)
+#endif
+
+#ifndef YIELD
+# ifdef SCHED_YIELD
+# define YIELD SCHED_YIELD
+# else
+# ifdef HAS_SCHED_YIELD
+# define YIELD sched_yield()
+# else
+# ifdef HAS_PTHREAD_YIELD
+ /* pthread_yield(NULL) platforms are expected
+ * to have #defined YIELD for themselves. */
+# define YIELD pthread_yield()
+# endif
+# endif
+# endif
#endif
#ifdef PTHREADS_CREATED_JOINABLE
# 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()
+# ifdef __UNDETACHED
+# define ATTR_JOINABLE __UNDETACHED
# endif
# endif
#endif
#endif /* SET_THR */
#ifndef THR
-# ifdef OLD_PTHREADS_API
-struct perl_thread *getTHR _((void));
-# define THR getTHR()
-# else
-# define THR ((struct perl_thread *) pthread_getspecific(PL_thr_key))
-# endif /* OLD_PTHREADS_API */
-#endif /* THR */
+#define THR ((struct perl_thread *) pthread_getspecific(PL_thr_key))
+#endif
/*
* dTHR is performance-critical. Here, we only do the pthread_get_specific
* Systems with very fast mutexes (and/or slow conditionals) may wish to
* remove the "if (threadnum) ..." test.
*/
-#define LOCK_SV_MUTEX \
- STMT_START { \
+#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 { \
+#define UNLOCK_SV_MUTEX \
+ STMT_START { \
+ if (PL_threadnum) \
+ 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); \
+ } STMT_END
+
+#define UNLOCK_STRTAB_MUTEX \
+ STMT_START { \
if (PL_threadnum) \
- MUTEX_UNLOCK(&PL_sv_mutex); \
+ MUTEX_UNLOCK(&PL_strtab_mutex); \
} STMT_END
#ifndef THREAD_RET_TYPE
#define ThrSETSTATE(t, s) STMT_START { \
(t)->flags &= ~THRf_STATE_MASK; \
(t)->flags |= (s); \
- DEBUG_L(PerlIO_printf(PerlIO_stderr(), \
+ DEBUG_S(PerlIO_printf(PerlIO_stderr(), \
"thread %p set to state %d\n", (t), (s))); \
} STMT_END
#define COND_DESTROY(c)
#define LOCK_SV_MUTEX
#define UNLOCK_SV_MUTEX
+#define LOCK_STRTAB_MUTEX
+#define UNLOCK_STRTAB_MUTEX
#define THR
/* Rats: if dTHR is just blank then the subsequent ";" throws an error */