]> code.delx.au - gnu-emacs/commitdiff
* src/gmalloc.c (_malloc_mutex, _aligned_blocks_mutex) [CYGWIN]: Use ERRORCHECK mutex...
authorKen Brown <kbrown@cornell.edu>
Mon, 11 Aug 2014 15:25:08 +0000 (11:25 -0400)
committerKen Brown <kbrown@cornell.edu>
Mon, 11 Aug 2014 15:25:08 +0000 (11:25 -0400)
src/ChangeLog
src/gmalloc.c

index 92d90accc60477ee5555524f28a3fe78c47d6d45..628fa26d778cbfffdb7234975be8627ed93a9cec 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-11  Ken Brown  <kbrown@cornell.edu>
+
+       * gmalloc.c (_malloc_mutex, _aligned_blocks_mutex) [CYGWIN]: Use
+       ERRORCHECK mutexes.  (Bug#18222)
+
 2014-08-11  Glenn Morris  <rgm@gnu.org>
 
        * fileio.c: Revert 2013-01-31 change, which chose coding system for
index 977abbdbbbd2b664310434f96b25007fbdc4227d..0e90b5a349845c088b1fb7c2db02ceaf5c922d98 100644 (file)
@@ -490,8 +490,18 @@ register_heapinfo (void)
 }
 
 #ifdef USE_PTHREAD
+/* On Cygwin prior to 1.7.31, pthread_mutexes were ERRORCHECK mutexes
+   by default.  When the default changed to NORMAL in Cygwin-1.7.31,
+   deadlocks occurred (bug#18222).  As a temporary workaround, we
+   explicitly set the mutexes to be of ERRORCHECK type, restoring the
+   previous behavior.  */
+#ifdef CYGWIN
+pthread_mutex_t _malloc_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
+pthread_mutex_t _aligned_blocks_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
+#else  /* not CYGWIN */
 pthread_mutex_t _malloc_mutex = PTHREAD_MUTEX_INITIALIZER;
 pthread_mutex_t _aligned_blocks_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif /* not CYGWIN */
 int _malloc_thread_enabled_p;
 
 static void
@@ -526,14 +536,23 @@ malloc_enable_thread (void)
      initialized mutexes when they are used first.  To avoid such a
      situation, we initialize mutexes here while their use is
      disabled in malloc etc.  */
+#ifdef CYGWIN
+  /* Use ERRORCHECK mutexes; see comment above. */
+  pthread_mutexattr_t attr;
+  pthread_mutexattr_init (&attr);
+  pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK);
+  pthread_mutex_init (&_malloc_mutex, &attr);
+  pthread_mutex_init (&_aligned_blocks_mutex, &attr);
+#else  /* not CYGWIN */
   pthread_mutex_init (&_malloc_mutex, NULL);
   pthread_mutex_init (&_aligned_blocks_mutex, NULL);
+#endif /* not CYGWIN */
   pthread_atfork (malloc_atfork_handler_prepare,
                  malloc_atfork_handler_parent,
                  malloc_atfork_handler_child);
   _malloc_thread_enabled_p = 1;
 }
-#endif
+#endif /* USE_PTHREAD */
 
 static void
 malloc_initialize_1 (void)