diff options
author | Florian Weimer <fweimer@redhat.com> | 2016-04-14 09:17:02 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2016-04-14 09:17:02 +0200 |
commit | 29d794863cd6e03115d3670707cc873a9965ba92 (patch) | |
tree | f5d714f3857f3c2f2468c9f9977fcefc2be75cfb /manual/memory.texi | |
parent | b49ab5f4503f36dcbf43f821f817da66b2931fe6 (diff) | |
download | glibc-29d794863cd6e03115d3670707cc873a9965ba92.tar.gz |
malloc: Run fork handler as late as possible [BZ #19431]
Previously, a thread M invoking fork would acquire locks in this order:
(M1) malloc arena locks (in the registered fork handler)
(M2) libio list lock
A thread F invoking flush (NULL) would acquire locks in this order:
(F1) libio list lock
(F2) individual _IO_FILE locks
A thread G running getdelim would use this order:
(G1) _IO_FILE lock
(G2) malloc arena lock
After executing (M1), (F1), (G1), none of the threads can make progress.
This commit changes the fork lock order to:
(M'1) libio list lock
(M'2) malloc arena locks
It explicitly encodes the lock order in the implementations of fork,
and does not rely on the registration order, thus avoiding the deadlock.
Diffstat (limited to 'manual/memory.texi')
-rw-r--r-- | manual/memory.texi | 8 |
1 files changed, 0 insertions, 8 deletions
diff --git a/manual/memory.texi b/manual/memory.texi index 3d99147592..a3ecc0df7c 100644 --- a/manual/memory.texi +++ b/manual/memory.texi @@ -1051,14 +1051,6 @@ systems that do not support @w{ISO C11}. @c _dl_addr_inside_object ok @c determine_info ok @c __rtld_lock_unlock_recursive (dl_load_lock) @aculock -@c thread_atfork @asulock @aculock @acsfd @acsmem -@c __register_atfork @asulock @aculock @acsfd @acsmem -@c lll_lock (__fork_lock) @asulock @aculock -@c fork_handler_alloc @asulock @aculock @acsfd @acsmem -@c calloc dup @asulock @aculock @acsfd @acsmem -@c __linkin_atfork ok -@c catomic_compare_and_exchange_bool_acq ok -@c lll_unlock (__fork_lock) @aculock @c *_environ @mtsenv @c next_env_entry ok @c strcspn dup ok |