summaryrefslogtreecommitdiffstats
path: root/openmp/runtime/src/kmp_runtime.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'openmp/runtime/src/kmp_runtime.cpp')
-rw-r--r--openmp/runtime/src/kmp_runtime.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/openmp/runtime/src/kmp_runtime.cpp b/openmp/runtime/src/kmp_runtime.cpp
index 69eba21f3e9..a16d2fdb55e 100644
--- a/openmp/runtime/src/kmp_runtime.cpp
+++ b/openmp/runtime/src/kmp_runtime.cpp
@@ -4334,6 +4334,9 @@ kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
new_thr->th.th_spin_here = FALSE;
new_thr->th.th_next_waiting = 0;
+#if KMP_OS_UNIX
+ new_thr->th.th_blocking = false;
+#endif
#if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
new_thr->th.th_current_place = KMP_PLACE_UNDEFINED;
@@ -5961,6 +5964,18 @@ static void __kmp_internal_end(void) {
__kmp_reap_task_teams();
+#if KMP_OS_UNIX
+ // Threads that are not reaped should not access any resources since they
+ // are going to be deallocated soon, so the shutdown sequence should wait
+ // until all threads either exit the final spin-waiting loop or begin
+ // sleeping after the given blocktime.
+ for (i = 0; i < __kmp_threads_capacity; i++) {
+ kmp_info_t *thr = __kmp_threads[i];
+ while (thr && KMP_ATOMIC_LD_ACQ(&thr->th.th_blocking))
+ KMP_CPU_PAUSE();
+ }
+#endif
+
for (i = 0; i < __kmp_threads_capacity; ++i) {
// TBD: Add some checking...
// Something like KMP_DEBUG_ASSERT( __kmp_thread[ i ] == NULL );
OpenPOWER on IntegriCloud