From 748552d792c3b7042cb1ea39d86f52a5d6f2208c Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 6 Apr 2021 13:40:48 +0200 Subject: Unlock all mutex on child process when forking --- src/libtools/threads.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/libtools') diff --git a/src/libtools/threads.c b/src/libtools/threads.c index ed37ca2c..07fd5d75 100755 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -803,6 +803,21 @@ emu_jmpbuf_t* GetJmpBuf() return ejb; } +static void atfork_child(void) +{ + //unlock all potential mutex, this is a new fork! + pthread_mutex_unlock(&my_context->mutex_once); + pthread_mutex_unlock(&my_context->mutex_once2); + pthread_mutex_unlock(&my_context->mutex_trace); + #ifndef DYNAREC + pthread_mutex_unlock(&my_context->mutex_lock); + #else + pthread_mutex_unlock(&my_context->mutex_dyndump); + #endif + pthread_mutex_unlock(&my_context->mutex_tls); + pthread_mutex_unlock(&my_context->mutex_thread); +} + void init_pthread_helper() { InitCancelThread(); @@ -815,6 +830,7 @@ void init_pthread_helper() unaligned_mutex = kh_init(mutex); #endif #endif + pthread_atfork(NULL, NULL, atfork_child); } void fini_pthread_helper(box64context_t* context) -- cgit 1.4.1