dead lock in forked child

Salvatore Sanfilippo antirez at gmail.com
Tue Oct 9 15:48:01 PDT 2012


Sorry now I realize that we just always allocate something in main()
before doing anything else, so there is no need to touch an RC for
this.

Looking forward to the next jemalloc release :-)
Salvatore

On Wed, Oct 10, 2012 at 12:41 AM, Salvatore Sanfilippo
<antirez at gmail.com> wrote:
> Thank you Jason, I think we'll merge the fix in the Redis 2.6 branch
> that is currently in release candidate.
>
> Cheers,
> Salvatore
>
> On Wed, Oct 10, 2012 at 12:36 AM, Jason Evans <jasone at canonware.com> wrote:
>> On Jun 1, 2012, at 11:31 AM, Jason Evans wrote:
>>
>> On May 25, 2012, at 2:02 AM, Jokea wrote:
>>
>> I've found that a forked child runs into dead lock in a multithreaded
>> application.
>>
>>
>> jemalloc calls pthread_atfork() during initialization, but the test program
>> does no allocation in the main thread before forking, and it launches
>> threads that race with it.  It appears that one of those threads gets part
>> way through allocator initialization before the fork occurs, which leaves
>> the allocator in an inconsistent state (init_lock locked, but initialization
>> incomplete).  The simple workaround is to allocate something before forking.
>>
>> A general fix in jemalloc is messy at best.  The possibilities that come to
>> mind are 1) intercepting pthread_create() (or all fork-like system calls)
>> much as the lazy locking code in mutex.c does and forcing allocator
>> initialization, or 2) using a library initializer (function specified via
>> compiler attribute to be run during library load) to force allocator
>> initialization.  Both of these approaches are somewhat fragile;
>> dlsym(RTLD_NEXT, …) can break if other libraries play similar games, and
>> library initializers don't run early enough to prevent all possible
>> failures.  In any case, I'll make a note to experiment with (2).
>>
>>
>> I just committed a fix for this bug:
>>
>> http://www.canonware.com/cgi-bin/gitweb.cgi?p=jemalloc.git;a=commitdiff;h=20f1fc95adb35ea63dc61f47f2b0ffbd37d39f32
>>
>> It turned out that there were also some mutex acquire/release calls missing
>> in the prefork/postfork functions, but most applications would not have
>> exercised the code necessary to cause related deadlocks.
>>
>> Jason
>>
>> _______________________________________________
>> jemalloc-discuss mailing list
>> jemalloc-discuss at canonware.com
>> http://www.canonware.com/mailman/listinfo/jemalloc-discuss
>>
>
>
>
> --
> Salvatore 'antirez' Sanfilippo
> open source developer - VMware
> http://invece.org
>
> Beauty is more important in computing than anywhere else in technology
> because software is so complicated. Beauty is the ultimate defence
> against complexity.
>        — David Gelernter



-- 
Salvatore 'antirez' Sanfilippo
open source developer - VMware
http://invece.org

Beauty is more important in computing than anywhere else in technology
because software is so complicated. Beauty is the ultimate defence
against complexity.
       — David Gelernter



More information about the jemalloc-discuss mailing list