This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

malloc patch for atfork


Hi,

I suggest that the following small patch is applied for 2.2.4, even
though I can't yet provide a testcase which is fixed by this change.
Several people are currently examining the problem and a test case
will emerge when the problem is analyzed more completely.  The code
that is still hanging with an SMP Linux system can be found at:

http://www.malloc.de/tests/fork-malloc.c

I have tested the patch for several weeks now on UP and dual-SMP.

Regards,
Wolfram.

2001-06-01  Wolfram Gloger  <wg@malloc.de>

	* malloc/malloc.c (malloc_atfork, free_atfork): Use a unique value
	ATFORK_ARENA_PTR, not 0, for the thread-specific arena pointer
	when malloc_atfork is in use.

--- malloc/malloc.c	2001/02/14 22:27:17	1.1.1.22
+++ malloc/malloc.c	2001/06/01 15:38:53
@@ -1590,6 +1590,11 @@
 
 #ifndef NO_THREADS
 
+/* Magic value for the thread-specific arena pointer when
+   malloc_atfork() is in use.  */
+
+#define ATFORK_ARENA_PTR ((Void_t*)-1)
+
 /* The following two functions are registered via thread_atfork() to
    make sure that the mutexes remain in a consistent state in the
    fork()ed version of a thread.  Also adapt the malloc and free hooks
@@ -1620,7 +1625,7 @@
   __free_hook = free_atfork;
   /* Only the current thread may perform malloc/free calls now. */
   tsd_getspecific(arena_key, save_arena);
-  tsd_setspecific(arena_key, (Void_t*)0);
+  tsd_setspecific(arena_key, ATFORK_ARENA_PTR);
 #endif
 }
 
@@ -4140,6 +4145,8 @@
 
 #ifndef NO_THREADS
   tsd_getspecific(arena_key, vptr);
+  if(vptr == ATFORK_ARENA_PTR)
+    vptr = (Void_t*)&main_arena;
 #endif
   malloc_update_mallinfo((vptr ? (arena*)vptr : &main_arena), &mi);
   return mi;
@@ -4687,7 +4694,8 @@
   mchunkptr victim;
 
   tsd_getspecific(arena_key, vptr);
-  if(!vptr) {
+  if(vptr == ATFORK_ARENA_PTR) {
+    /* We are the only thread that may allocate at all.  */
     if(save_malloc_hook != malloc_check) {
       if(request2size(sz, nb))
         return 0;
@@ -4735,10 +4743,10 @@
 
   ar_ptr = arena_for_ptr(p);
   tsd_getspecific(arena_key, vptr);
-  if(vptr)
+  if(vptr != ATFORK_ARENA_PTR)
     (void)mutex_lock(&ar_ptr->mutex);
   chunk_free(ar_ptr, p);
-  if(vptr)
+  if(vptr != ATFORK_ARENA_PTR)
     (void)mutex_unlock(&ar_ptr->mutex);
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]