]> granicus.if.org Git - check/commitdiff
* Fix for mutex deadlock when killing threads, patch #3564640 on SF
authorhugo303 <hugo303@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Thu, 11 Oct 2012 11:55:13 +0000 (11:55 +0000)
committerhugo303 <hugo303@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Thu, 11 Oct 2012 11:55:13 +0000 (11:55 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/check/code/trunk@626 64e312b2-a51f-0410-8e61-82d0ca0eb02a

NEWS
src/check_pack.c

diff --git a/NEWS b/NEWS
index 46c55e30b6dde70ead4da2194f799c696c629563..a376cc4df5e03e9bfde8bf2d94fc9bc252090e04 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,7 @@
 In development.
 
+* Fix for mutex deadlock when killing threads, patch #3564640 on SF.
+
 * Make XML output well-formed, solution from patch #3575642 on SF.
   Solves bug #3485651 also.
 
index c239884da15f2eaaa4159fe26c4ddecd7bbd5ac8..741e1b0fb4bc5a866cfd643f20c179c2c5dadb6e 100644 (file)
@@ -37,6 +37,8 @@
 #ifndef HAVE_PTHREAD
 #define pthread_mutex_lock(arg)
 #define pthread_mutex_unlock(arg)
+#define pthread_cleanup_push(f,a) {
+#define pthread_cleanup_pop(e) }
 #endif
 
 /* Maximum size for one message in the message stream. */
@@ -263,6 +265,10 @@ static void check_type (int type, const char *file, int line)
 
 #ifdef HAVE_PTHREAD
 static pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;
+void ppack_cleanup( void *mutex )
+{
+  pthread_mutex_unlock(mutex);
+}
 #endif
 
 void ppack (int fdes, enum ck_msg_type type, CheckMsg *msg)
@@ -276,9 +282,11 @@ void ppack (int fdes, enum ck_msg_type type, CheckMsg *msg)
   if (n > (CK_MAX_MSG_SIZE / 2))
     eprintf("Message string too long", __FILE__, __LINE__ - 2);
 
+  pthread_cleanup_push( ppack_cleanup, &mutex_lock );
   pthread_mutex_lock(&mutex_lock);
   r = write (fdes, buf, n);
   pthread_mutex_unlock(&mutex_lock);
+  pthread_cleanup_pop(0);
   if (r == -1)
     eprintf ("Error in call to write:", __FILE__, __LINE__ - 2);