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
, __dlerror_lockptr
);
13 weak_alias(dummy_lockptr
, __gettext_lockptr
);
14 weak_alias(dummy_lockptr
, __locale_lockptr
);
15 weak_alias(dummy_lockptr
, __random_lockptr
);
16 weak_alias(dummy_lockptr
, __sem_open_lockptr
);
17 weak_alias(dummy_lockptr
, __stdio_ofl_lockptr
);
18 weak_alias(dummy_lockptr
, __syslog_lockptr
);
19 weak_alias(dummy_lockptr
, __timezone_lockptr
);
20 weak_alias(dummy_lockptr
, __bump_lockptr
);
22 weak_alias(dummy_lockptr
, __vmlock_lockptr
);
24 static volatile int *const *const atfork_locks
[] = {
25 &__at_quick_exit_lockptr
,
38 static void dummy(int x
) { }
39 weak_alias(dummy
, __fork_handler
);
40 weak_alias(dummy
, __malloc_atfork
);
41 weak_alias(dummy
, __ldso_atfork
);
43 static void dummy_0(void) { }
44 weak_alias(dummy_0
, __tl_lock
);
45 weak_alias(dummy_0
, __tl_unlock
);
51 __block_app_sigs(&set
);
52 int need_locks
= libc
.need_locks
> 0;
56 for (int i
=0; i
<sizeof atfork_locks
/sizeof *atfork_locks
; i
++)
57 if (*atfork_locks
[i
]) LOCK(*atfork_locks
[i
]);
61 pthread_t self
=__pthread_self(), next
=self
->next
;
63 int errno_save
= errno
;
66 for (pthread_t td
=next
; td
!=self
; td
=td
->next
)
68 if (__vmlock_lockptr
) {
69 __vmlock_lockptr
[0] = 0;
70 __vmlock_lockptr
[1] = 0;
74 __malloc_atfork(!ret
);
75 for (int i
=0; i
<sizeof atfork_locks
/sizeof *atfork_locks
; i
++)
77 if (ret
) UNLOCK(*atfork_locks
[i
]);
78 else **atfork_locks
[i
] = 0;
84 if (ret
<0) errno
= errno_save
;