# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s)
#endif
+#ifndef PTHREAD_CREATE_JOINABLE
+# ifdef OLD_PTHREAD_CREATE_JOINABLE
+# define PTHREAD_CREATE_JOINABLE OLD_PTHREAD_CREATE_JOINABLE
+# else
+# define PTHREAD_CREATE_JOINABLE 0 /* Panic? No, guess. */
+# endif
+#endif
+
#ifdef I_MACH_CTHREADS
/* cthreads interface */
# endif
#endif
-#if !defined(ATTR_JOINABLE) && defined(PTHREAD_CREATE_JOINABLE)
-# define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE
-#endif
-#if !defined(ATTR_JOINABLE) && defined(PTHREAD_CREATE_UNDETACHED)
-# define ATTR_JOINABLE PTHREAD_CREATE_UNDETACHED
-#endif
-#if !defined(ATTR_JOINABLE) && defined(__UNDETACHED)
-# define ATTR_JOINABLE __UNDETACHED
+#ifdef __hpux
+# define MUTEX_INIT_NEEDS_MUTEX_ZEROED
#endif
#ifndef MUTEX_INIT
+#ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
+ /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */
+#define MUTEX_INIT(m) \
+ STMT_START { \
+ Zero((m), 1, perl_mutex); \
+ if (pthread_mutex_init((m), pthread_mutexattr_default)) \
+ croak("panic: MUTEX_INIT"); \
+ } STMT_END
+#else
#define MUTEX_INIT(m) \
STMT_START { \
if (pthread_mutex_init((m), pthread_mutexattr_default)) \
croak("panic: MUTEX_INIT"); \
} STMT_END
+#endif
#define MUTEX_LOCK(m) \
STMT_START { \
if (pthread_mutex_lock((m))) \
* 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".
+ *
+ * The use of PL_threadnum should be safe here.
*/
#ifndef dTHR
# define dTHR \
* 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.
+ * XXX do NOT use C<if (PL_threadnum) ...> -- it sets up race conditions!
*/
#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 { \
- if (PL_threadnum) \
- MUTEX_UNLOCK(&PL_sv_mutex); \
+ 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); \
+ MUTEX_LOCK(&PL_strtab_mutex); \
} STMT_END
#define UNLOCK_STRTAB_MUTEX \
STMT_START { \
- if (PL_threadnum) \
- MUTEX_UNLOCK(&PL_strtab_mutex); \
+ MUTEX_UNLOCK(&PL_strtab_mutex); \
} STMT_END
#ifndef THREAD_RET_TYPE