Try to fix FreeBSD bug re multithreaded memory allocation.
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 4 Jul 2013 00:53:13 +0000 (17:53 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 4 Jul 2013 00:53:13 +0000 (17:53 -0700)
* src/emacs.c (main) [HAVE_PTHREAD && !SYSTEM_MALLOC && !DOUG_LEA_MALLOC]:
Clear _malloc_thread_enabled_p at startup.  Reported by Ashish SHUKLA in
<http://lists.gnu.org/archive/html/emacs-devel/2013-07/msg00088.html>.

Fixes: debbugs:14569

src/ChangeLog
src/emacs.c

index 322b827..5391cef 100644 (file)
@@ -1,3 +1,10 @@
+2013-07-04  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Try to fix FreeBSD bug re multithreaded memory allocation (Bug#14569).
+       * emacs.c (main) [HAVE_PTHREAD && !SYSTEM_MALLOC && !DOUG_LEA_MALLOC]:
+       Clear _malloc_thread_enabled_p at startup.  Reported by Ashish SHUKLA in
+       <http://lists.gnu.org/archive/html/emacs-devel/2013-07/msg00088.html>.
+
 2013-07-02  Paul Eggert  <eggert@cs.ucla.edu>
 
        * sysdep.c (sys_siglist) [HAVE_DECL___SYS_SIGLIST]:
index 08be786..bebc5e4 100644 (file)
@@ -128,6 +128,7 @@ extern int malloc_set_state (void*);
    dumping.  Used to work around a bug in glibc's malloc.  */
 static bool malloc_using_checking;
 #elif defined HAVE_PTHREAD && !defined SYSTEM_MALLOC
+extern int _malloc_thread_enabled_p;
 extern void malloc_enable_thread (void);
 #endif
 
@@ -681,6 +682,12 @@ main (int argc, char **argv)
   stack_base = &dummy;
 #endif
 
+#if defined HAVE_PTHREAD && !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC
+  /* Disable mutexes in gmalloc.c.  Otherwise, FreeBSD Emacs recursively
+     loops with pthread_mutex_lock calling calloc and vice versa.  */
+  _malloc_thread_enabled_p = 0;
+#endif
+
 #ifdef G_SLICE_ALWAYS_MALLOC
   /* This is used by the Cygwin build.  */
   xputenv ("G_SLICE=always-malloc");