5 #include "pthread_impl.h"
8 static volatile int *const dummy_lockptr = 0;
10 weak_alias(dummy_lockptr, __at_quick_exit_lockptr);
11 weak_alias(dummy_lockptr, __atexit_lockptr);
12 weak_alias(dummy_lockptr, __gettext_lockptr);
13 weak_alias(dummy_lockptr, __locale_lockptr);
14 weak_alias(dummy_lockptr, __random_lockptr);
15 weak_alias(dummy_lockptr, __sem_open_lockptr);
16 weak_alias(dummy_lockptr, __stdio_ofl_lockptr);
17 weak_alias(dummy_lockptr, __syslog_lockptr);
18 weak_alias(dummy_lockptr, __timezone_lockptr);
19 weak_alias(dummy_lockptr, __bump_lockptr);
21 weak_alias(dummy_lockptr, __vmlock_lockptr);
23 static volatile int *const *const atfork_locks[] = {
24 &__at_quick_exit_lockptr,
36 static void dummy(int x) { }
37 weak_alias(dummy, __fork_handler);
38 weak_alias(dummy, __malloc_atfork);
39 weak_alias(dummy, __ldso_atfork);
41 static void dummy_0(void) { }
42 weak_alias(dummy_0, __tl_lock);
43 weak_alias(dummy_0, __tl_unlock);
49 __block_app_sigs(&set);
50 int need_locks = libc.need_locks > 0;
54 for (int i=0; i<sizeof atfork_locks/sizeof *atfork_locks; i++)
55 if (*atfork_locks[i]) LOCK(*atfork_locks[i]);
59 pthread_t self=__pthread_self(), next=self->next;
61 int errno_save = errno;
64 for (pthread_t td=next; td!=self; td=td->next)
66 if (__vmlock_lockptr) {
67 __vmlock_lockptr[0] = 0;
68 __vmlock_lockptr[1] = 0;
72 __malloc_atfork(!ret);
73 for (int i=0; i<sizeof atfork_locks/sizeof *atfork_locks; i++)
75 if (ret) UNLOCK(*atfork_locks[i]);
76 else **atfork_locks[i] = 0;
82 if (ret<0) errno = errno_save;