diff options
author | Jason Evans <je@fb.com> | 2012-03-13 23:31:41 (GMT) |
---|---|---|
committer | Jason Evans <je@fb.com> | 2012-03-13 23:31:41 (GMT) |
commit | 4e2e3dd9cf19ed5991938a708a8b50611aa5bbf8 (patch) | |
tree | 0bd52cef3ce19d84725e6018a5b41bc6cdb8de2a /src/arena.c | |
parent | 824d34e5b7f5cf00bf472ec79f7ec1c6e3474114 (diff) | |
download | jemalloc-4e2e3dd9cf19ed5991938a708a8b50611aa5bbf8.zip jemalloc-4e2e3dd9cf19ed5991938a708a8b50611aa5bbf8.tar.gz jemalloc-4e2e3dd9cf19ed5991938a708a8b50611aa5bbf8.tar.bz2 |
Fix fork-related bugs.
Acquire/release arena bin locks as part of the prefork/postfork. This
bug made deadlock in the child between fork and exec a possibility.
Split jemalloc_postfork() into jemalloc_postfork_{parent,child}() so
that the child can reinitialize mutexes rather than unlocking them. In
practice, this bug tended not to cause problems.
Diffstat (limited to 'src/arena.c')
-rw-r--r-- | src/arena.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/arena.c b/src/arena.c index c14cb2c..898f8c7 100644 --- a/src/arena.c +++ b/src/arena.c @@ -2169,3 +2169,33 @@ arena_boot(void) bin_info_init(); } + +void +arena_prefork(arena_t *arena) +{ + unsigned i; + + malloc_mutex_prefork(&arena->lock); + for (i = 0; i < NBINS; i++) + malloc_mutex_prefork(&arena->bins[i].lock); +} + +void +arena_postfork_parent(arena_t *arena) +{ + unsigned i; + + for (i = 0; i < NBINS; i++) + malloc_mutex_postfork_parent(&arena->bins[i].lock); + malloc_mutex_postfork_parent(&arena->lock); +} + +void +arena_postfork_child(arena_t *arena) +{ + unsigned i; + + for (i = 0; i < NBINS; i++) + malloc_mutex_postfork_child(&arena->bins[i].lock); + malloc_mutex_postfork_child(&arena->lock); +} |