diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-06 13:40:48 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-06 13:40:48 +0200 |
| commit | 748552d792c3b7042cb1ea39d86f52a5d6f2208c (patch) | |
| tree | 51920468bf791944b302ccb1f0db4ad8855520de /src/libtools/threads.c | |
| parent | ff50b0c39178c9065b4815c68cd7c5cab3fdf336 (diff) | |
| download | box64-748552d792c3b7042cb1ea39d86f52a5d6f2208c.tar.gz box64-748552d792c3b7042cb1ea39d86f52a5d6f2208c.zip | |
Unlock all mutex on child process when forking
Diffstat (limited to 'src/libtools/threads.c')
| -rwxr-xr-x | src/libtools/threads.c | 16 |
1 files changed, 16 insertions, 0 deletions
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) |