diff options
Diffstat (limited to 'src/process/fork.c')
-rw-r--r-- | src/process/fork.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/process/fork.c b/src/process/fork.c index 54bc2892..56f19313 100644 --- a/src/process/fork.c +++ b/src/process/fork.c @@ -9,7 +9,6 @@ static volatile int *const dummy_lockptr = 0; weak_alias(dummy_lockptr, __at_quick_exit_lockptr); weak_alias(dummy_lockptr, __atexit_lockptr); -weak_alias(dummy_lockptr, __dlerror_lockptr); weak_alias(dummy_lockptr, __gettext_lockptr); weak_alias(dummy_lockptr, __locale_lockptr); weak_alias(dummy_lockptr, __random_lockptr); @@ -24,7 +23,6 @@ weak_alias(dummy_lockptr, __vmlock_lockptr); static volatile int *const *const atfork_locks[] = { &__at_quick_exit_lockptr, &__atexit_lockptr, - &__dlerror_lockptr, &__gettext_lockptr, &__locale_lockptr, &__random_lockptr, @@ -38,6 +36,8 @@ static volatile int *const *const atfork_locks[] = { static void dummy(int x) { } weak_alias(dummy, __fork_handler); weak_alias(dummy, __malloc_atfork); +weak_alias(dummy, __aio_atfork); +weak_alias(dummy, __pthread_key_atfork); weak_alias(dummy, __ldso_atfork); static void dummy_0(void) { } @@ -52,6 +52,8 @@ pid_t fork(void) int need_locks = libc.need_locks > 0; if (need_locks) { __ldso_atfork(-1); + __pthread_key_atfork(-1); + __aio_atfork(-1); __inhibit_ptc(); for (int i=0; i<sizeof atfork_locks/sizeof *atfork_locks; i++) if (*atfork_locks[i]) LOCK(*atfork_locks[i]); @@ -77,6 +79,8 @@ pid_t fork(void) if (ret) UNLOCK(*atfork_locks[i]); else **atfork_locks[i] = 0; __release_ptc(); + if (ret) __aio_atfork(0); + __pthread_key_atfork(!ret); __ldso_atfork(!ret); } __restore_sigs(&set); |