emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: emacs-unicode-2 bootstrap on FreeBSD (temacs coredump)


From: YAMAMOTO Mitsuharu
Subject: Re: emacs-unicode-2 bootstrap on FreeBSD (temacs coredump)
Date: Mon, 06 Aug 2007 17:47:55 +0900
User-agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (Shijō) APEL/10.6 Emacs/22.1.50 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)

>>>>> On Wed, 01 Aug 2007 20:27:06 +0200, "Jan D." <address@hidden> said:

> I tried it and temacs runs OK.  However, it seems that the mutex 
> initialization is lost, so it has to be done again with the dumped
> emacs.  pthread_self also allocates memory, so even if this is fixed
> we still get a loop.

How about deferring mutex initializations until an interactive session
starts?  Could you try the patch below?

> I also tried using system malloc on FreeBSD 6.2, but that didn't
> work.  Emacs crashed on first realloc (heap corrupt).  I guess
> undumping on FreeBSD with system malloc is broken (or perhaps
> impossible).

Too bad...

                                     YAMAMOTO Mitsuharu
                                address@hidden

Index: src/emacs.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/emacs.c,v
retrieving revision 1.404
diff -c -p -r1.404 emacs.c
*** src/emacs.c 26 Jul 2007 05:27:51 -0000      1.404
--- src/emacs.c 6 Aug 2007 08:40:40 -0000
*************** main (argc, argv
*** 1164,1169 ****
--- 1164,1176 ----
        setpgrp ();
  #endif
  #endif
+ #if defined (HAVE_GTK_AND_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined 
(DOUG_LEA_MALLOC)
+       {
+       extern void malloc_enable_thread P_ ((void));
+ 
+       malloc_enable_thread ();
+       }
+ #endif
      }
  
    init_signals ();
Index: src/gmalloc.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/gmalloc.c,v
retrieving revision 1.24
diff -c -p -r1.24 gmalloc.c
*** src/gmalloc.c       29 Jul 2007 10:12:21 -0000      1.24
--- src/gmalloc.c       6 Aug 2007 08:40:40 -0000
*************** extern __ptr_t memalign PP ((__malloc_si
*** 136,141 ****
--- 136,145 ----
  extern __ptr_t valloc PP ((__malloc_size_t __size));
  #endif
  
+ #ifdef USE_PTHREAD
+ /* Set up mutexes and make malloc etc. thread-safe.  */
+ extern void malloc_enable_thread PP ((void));
+ #endif
  
  #ifdef _MALLOC_INTERNAL
  
*************** extern void _free_internal_nolock PP ((_
*** 242,249 ****
  
  #ifdef USE_PTHREAD
  extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;
! #define LOCK()     pthread_mutex_lock (&_malloc_mutex)
! #define UNLOCK()   pthread_mutex_unlock (&_malloc_mutex)
  #define LOCK_ALIGNED_BLOCKS()     pthread_mutex_lock (&_aligned_blocks_mutex)
  #define UNLOCK_ALIGNED_BLOCKS()   pthread_mutex_unlock 
(&_aligned_blocks_mutex)
  #else
--- 246,260 ----
  
  #ifdef USE_PTHREAD
  extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;
! extern int _malloc_thread_enabled_p;
! #define LOCK() \
!   do { \
!     if (_malloc_thread_enabled_p) pthread_mutex_lock (&_malloc_mutex); \
!   } while (0)
! #define UNLOCK() \
!   do { \
!     if (_malloc_thread_enabled_p) pthread_mutex_unlock (&_malloc_mutex); \
!   } while (0)
  #define LOCK_ALIGNED_BLOCKS()     pthread_mutex_lock (&_aligned_blocks_mutex)
  #define UNLOCK_ALIGNED_BLOCKS()   pthread_mutex_unlock 
(&_aligned_blocks_mutex)
  #else
*************** register_heapinfo ()
*** 563,568 ****
--- 574,596 ----
  #ifdef USE_PTHREAD
  pthread_mutex_t _malloc_mutex = PTHREAD_MUTEX_INITIALIZER;
  pthread_mutex_t _aligned_blocks_mutex = PTHREAD_MUTEX_INITIALIZER;
+ int _malloc_thread_enabled_p;
+ 
+ /* Set up mutexes and make malloc etc. thread-safe.  */
+ void
+ malloc_enable_thread ()
+ {
+   if (_malloc_thread_enabled_p)
+     return;
+ 
+   /* Some pthread implementations call malloc for statically
+      initialized mutexes when they are used first.  To avoid such a
+      situation, we initialize mutexes here while their use is
+      disabled in malloc etc.  */
+   pthread_mutex_init (&_malloc_mutex, NULL);
+   pthread_mutex_init (&_aligned_blocks_mutex, NULL);
+   _malloc_thread_enabled_p = 1;
+ }
  #endif
  
  static void




reply via email to

[Prev in Thread] Current Thread [Next in Thread]