summaryrefslogtreecommitdiffstats
path: root/src/arena.c
diff options
context:
space:
mode:
authorJason Evans <je@fb.com>2012-03-13 23:31:41 (GMT)
committerJason Evans <je@fb.com>2012-03-13 23:31:41 (GMT)
commit4e2e3dd9cf19ed5991938a708a8b50611aa5bbf8 (patch)
tree0bd52cef3ce19d84725e6018a5b41bc6cdb8de2a /src/arena.c
parent824d34e5b7f5cf00bf472ec79f7ec1c6e3474114 (diff)
downloadjemalloc-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.c30
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);
+}