# ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
/* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */
# define MUTEX_INIT(m) \
- STMT_START { \
- int _eC_; \
- Zero((m), 1, perl_mutex); \
- if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \
- Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \
- _eC_, __FILE__, __LINE__); \
+ STMT_START { \
+ int _eC_; \
+ Zero((m), 1, perl_mutex); \
+ if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))\
+ Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
} STMT_END
# else
# define MUTEX_INIT(m) \
STMT_START { \
int _eC_; \
- if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \
- Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \
- _eC_, __FILE__, __LINE__); \
+ if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \
+ Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
} STMT_END
# endif
# define perl_pthread_mutex_unlock(m) pthread_mutex_unlock(m)
# endif
-# define MUTEX_LOCK(m) \
+# define MUTEX_LOCK(m) \
STMT_START { \
+ dSAVE_ERRNO; \
int _eC_; \
- if ((_eC_ = perl_pthread_mutex_lock((m)))) \
- Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]", \
+ if ((_eC_ = perl_pthread_mutex_lock((m)))) \
+ Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]",\
_eC_, __FILE__, __LINE__); \
+ RESTORE_ERRNO; \
} STMT_END
-# define MUTEX_UNLOCK(m) \
+# define MUTEX_UNLOCK(m) \
STMT_START { \
+ dSAVE_ERRNO; /* Shouldn't be necessary as panics if fails */\
int _eC_; \
- if ((_eC_ = perl_pthread_mutex_unlock((m)))) \
- Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]", \
+ if ((_eC_ = perl_pthread_mutex_unlock((m)))) { \
+ Perl_croak_nocontext( \
+ "panic: MUTEX_UNLOCK (%d) [%s:%d]", \
_eC_, __FILE__, __LINE__); \
+ } \
+ RESTORE_ERRNO; \
} STMT_END
-# define MUTEX_DESTROY(m) \
+# define MUTEX_DESTROY(m) \
STMT_START { \
int _eC_; \
- if ((_eC_ = pthread_mutex_destroy((m)))) \
+ if ((_eC_ = pthread_mutex_destroy((m)))) { \
Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]", \
_eC_, __FILE__, __LINE__); \
+ } \
} STMT_END
#endif /* MUTEX_INIT */
# define PERL_GET_CONTEXT PL_current_context
-/* Set our thread-specific value anyway, in case code is reading it directly. */
-# define PERL_SET_CONTEXT(t) \
- STMT_START { \
- int _eC_; \
- if ((_eC_ = pthread_setspecific(PL_thr_key, PL_current_context = (void *)(t)))) \
+/* We must also call pthread_setspecific() always, as C++ code has to read it
+ * with pthreads (the #else side just below) */
+
+# define PERL_SET_CONTEXT(t) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_setspecific(PL_thr_key, \
+ PL_current_context = (void *)(t)))) \
Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]", \
- _eC_, __FILE__, __LINE__); \
+ _eC_, __FILE__, __LINE__); \
} STMT_END
#else
# define PERL_GET_CONTEXT PTHREAD_GETSPECIFIC(PL_thr_key)
# endif
+/* For C++ extensions built on a system where the C compiler provides thread
+ * local storage that call PERL_SET_CONTEXT() also need to set
+ * PL_current_context, so need to call into C code to do this.
+ * To avoid exploding code complexity, do this also on C platforms that don't
+ * support thread local storage. PERL_SET_CONTEXT is not called that often. */
+
# ifndef PERL_SET_CONTEXT
-# define PERL_SET_CONTEXT(t) \
- STMT_START { \
- int _eC_; \
- if ((_eC_ = pthread_setspecific(PL_thr_key, (void *)(t)))) \
- Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]", \
- _eC_, __FILE__, __LINE__); \
- } STMT_END
+# define PERL_SET_CONTEXT(t) Perl_set_context((void*)t)
# endif /* PERL_SET_CONTEXT */
#endif /* PERL_THREAD_LOCAL */