about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-06 13:40:48 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-06 13:40:48 +0200
commit748552d792c3b7042cb1ea39d86f52a5d6f2208c (patch)
tree51920468bf791944b302ccb1f0db4ad8855520de /src/libtools
parentff50b0c39178c9065b4815c68cd7c5cab3fdf336 (diff)
downloadbox64-748552d792c3b7042cb1ea39d86f52a5d6f2208c.tar.gz
box64-748552d792c3b7042cb1ea39d86f52a5d6f2208c.zip
Unlock all mutex on child process when forking
Diffstat (limited to 'src/libtools')
-rwxr-xr-xsrc/libtools/threads.c16
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)