Lock pshared_lock shared around fork, to ensure that the COW snapshot
of the pshared hash in child is consistent and can be safely used. Reported and tested by: "Oleg V. Nauman" <oleg@opentransfer.com> Sponsored by: The FreeBSD Foundation
This commit is contained in:
parent
07f22a288d
commit
53fd961f05
@ -168,6 +168,7 @@ __thr_fork(void)
|
||||
if (_thr_isthreaded() != 0) {
|
||||
was_threaded = 1;
|
||||
_malloc_prefork();
|
||||
__thr_pshared_atfork_pre();
|
||||
_rtld_atfork_pre(rtld_locks);
|
||||
} else {
|
||||
was_threaded = 0;
|
||||
@ -202,8 +203,10 @@ __thr_fork(void)
|
||||
|
||||
_thr_signal_postfork_child();
|
||||
|
||||
if (was_threaded)
|
||||
if (was_threaded) {
|
||||
_rtld_atfork_post(rtld_locks);
|
||||
__thr_pshared_atfork_post();
|
||||
}
|
||||
_thr_setthreaded(0);
|
||||
|
||||
/* reinitalize library. */
|
||||
@ -236,6 +239,7 @@ __thr_fork(void)
|
||||
|
||||
if (was_threaded) {
|
||||
_rtld_atfork_post(rtld_locks);
|
||||
__thr_pshared_atfork_post();
|
||||
_malloc_postfork();
|
||||
}
|
||||
|
||||
|
@ -445,7 +445,6 @@ init_private(void)
|
||||
_thr_once_init();
|
||||
_thr_spinlock_init();
|
||||
_thr_list_init();
|
||||
__thr_pshared_init();
|
||||
_thr_wake_addr_init();
|
||||
_sleepq_init();
|
||||
_single_thread = NULL;
|
||||
@ -456,6 +455,7 @@ init_private(void)
|
||||
* e.g. after a fork().
|
||||
*/
|
||||
if (init_once == 0) {
|
||||
__thr_pshared_init();
|
||||
/* Find the stack top */
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_USRSTACK;
|
||||
|
@ -952,6 +952,8 @@ void _tcb_dtor(struct tcb *);
|
||||
void __thr_pshared_init(void) __hidden;
|
||||
void *__thr_pshared_offpage(void *key, int doalloc) __hidden;
|
||||
void __thr_pshared_destroy(void *key) __hidden;
|
||||
void __thr_pshared_atfork_pre(void) __hidden;
|
||||
void __thr_pshared_atfork_post(void) __hidden;
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
@ -252,3 +252,17 @@ __thr_pshared_destroy(void *key)
|
||||
pshared_clean(key, val);
|
||||
pshared_gc(curthread);
|
||||
}
|
||||
|
||||
void
|
||||
__thr_pshared_atfork_pre(void)
|
||||
{
|
||||
|
||||
_thr_rwl_rdlock(&pshared_lock);
|
||||
}
|
||||
|
||||
void
|
||||
__thr_pshared_atfork_post(void)
|
||||
{
|
||||
|
||||
_thr_rwl_unlock(&pshared_lock);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user