Improve stability of the runtime in parent/child processes
This change improves stability of the runtime when the application forks child
processes. Acquiring/releasing __kmp_initz_lock and __kmp_forkjoin_lock in the
atfork handlers insures that the actual fork does not occur while those two
locks are held, and __kmp_itt_reset() reverts the itt's global state to the
initial state which also initializes the mutex stored in the global state.
Some missing initialization code was also inserted in the child's atfork handler.
Patch by Hansang Bae
Differential Revision: https://reviews.llvm.org/D41462
llvm-svn: 322202
diff --git a/openmp/runtime/src/z_Linux_util.cpp b/openmp/runtime/src/z_Linux_util.cpp
index fa9b1c5..d7e2ed8 100644
--- a/openmp/runtime/src/z_Linux_util.cpp
+++ b/openmp/runtime/src/z_Linux_util.cpp
@@ -1253,16 +1253,22 @@
#endif
}
-static void __kmp_atfork_prepare(void) { /* nothing to do */
+static void __kmp_atfork_prepare(void) {
+ __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
+ __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
}
-static void __kmp_atfork_parent(void) { /* nothing to do */
+static void __kmp_atfork_parent(void) {
+ __kmp_release_bootstrap_lock(&__kmp_initz_lock);
+ __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
}
/* Reset the library so execution in the child starts "all over again" with
clean data structures in initial states. Don't worry about freeing memory
allocated by parent, just abandon it to be safe. */
static void __kmp_atfork_child(void) {
+ __kmp_release_bootstrap_lock(&__kmp_initz_lock);
+ __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
/* TODO make sure this is done right for nested/sibling */
// ATT: Memory leaks are here? TODO: Check it and fix.
/* KMP_ASSERT( 0 ); */
@@ -1307,6 +1313,10 @@
__kmp_all_nth = 0;
TCW_4(__kmp_nth, 0);
+ __kmp_thread_pool = NULL;
+ __kmp_thread_pool_insert_pt = NULL;
+ __kmp_team_pool = NULL;
+
/* Must actually zero all the *cache arguments passed to __kmpc_threadprivate
here so threadprivate doesn't use stale data */
KA_TRACE(10, ("__kmp_atfork_child: checking cache address list %p\n",
@@ -1329,6 +1339,9 @@
__kmp_init_bootstrap_lock(&__kmp_initz_lock);
__kmp_init_bootstrap_lock(&__kmp_stdio_lock);
__kmp_init_bootstrap_lock(&__kmp_console_lock);
+ __kmp_init_bootstrap_lock(&__kmp_task_team_lock);
+
+ __kmp_itt_reset(); // reset ITT's global state
/* This is necessary to make sure no stale data is left around */
/* AC: customers complain that we use unsafe routines in the atfork