[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: thread assert with 1.8.2
From: |
Ludovic Courtès |
Subject: |
Re: thread assert with 1.8.2 |
Date: |
Thu, 23 Aug 2007 00:36:40 +0200 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) |
Hi,
Greg Troxel <address@hidden> writes:
> I just updated pkgsrc to 1.8.2, and on NetBSD-current/i386 make check
> fails in the thread test with:
Does this happen with previous 1.8 releases?
> Perhaps someone could try this on Linux with the right magic debug
> variables to object to unlocking an unlocked mutex. (On NetBSD, the
> default behavior is to abort on any operation which the standard says is
> undefined.)
I tried the attached patch (which does what Kevin suggested) on
GNU/Linux, and recompiled with `-DSCM_USE_ERROR_CHECKING_MUTEXES=1'.
I then run the whole test-suite (on i686), without observing anything
special. Running `threads.test' in a loop didn't trigger the error
either.
Further investigation is needed...
Ludovic.
--- orig/libguile/pthread-threads.h
+++ mod/libguile/pthread-threads.h
@@ -43,13 +43,51 @@
/* Mutexes
*/
-#define SCM_I_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+#ifdef SCM_USE_ERROR_CHECKING_MUTEXES
+# if (!defined PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP) || (!defined __GNUC__)
+# undef SCM_USE_ERROR_CHECKING_MUTEXES
+# endif
+#endif
+
+#ifdef SCM_USE_ERROR_CHECKING_MUTEXES
+# define SCM_I_PTHREAD_MUTEX_INITIALIZER
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+#else
+# define SCM_I_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+#endif
+
#define scm_i_pthread_mutex_t pthread_mutex_t
#define scm_i_pthread_mutex_init pthread_mutex_init
#define scm_i_pthread_mutex_destroy pthread_mutex_destroy
#define scm_i_pthread_mutex_trylock pthread_mutex_trylock
-#define scm_i_pthread_mutex_lock pthread_mutex_lock
-#define scm_i_pthread_mutex_unlock pthread_mutex_unlock
+
+#ifdef SCM_USE_ERROR_CHECKING_MUTEXES
+
+# define scm_i_pthread_mutex_lock(m) \
+ ({ \
+ int mutex_err_; \
+ mutex_err_ = pthread_mutex_lock (m); \
+ if (mutex_err_) \
+ scm_syserror_msg ("mutex_lock", "`pthread_mutex_lock' failed", \
+ SCM_EOL, mutex_err_); \
+ mutex_err_; \
+ })
+# define scm_i_pthread_mutex_unlock(m) \
+ ({ \
+ int mutex_err_; \
+ mutex_err_ = pthread_mutex_unlock (m); \
+ if (mutex_err_) \
+ scm_syserror_msg ("mutex_unlock", "`pthread_mutex_unlock' failed", \
+ SCM_EOL, mutex_err_); \
+ mutex_err_; \
+ })
+
+#else /* !SCM_USE_ERROR_CHECKING_MUTEXES */
+
+# define scm_i_pthread_mutex_lock pthread_mutex_lock
+# define scm_i_pthread_mutex_unlock pthread_mutex_unlock
+
+#endif /* !SCM_USE_ERROR_CHECKING_MUTEXES */
+
extern pthread_mutexattr_t scm_i_pthread_mutexattr_recursive[1];
/* Condition variables