[Openmp-commits] [PATCH] D14458: Fixes to wait-loop code

Jonathan Peyton via Openmp-commits openmp-commits at lists.llvm.org
Mon Nov 9 08:34:28 PST 2015


This revision was automatically updated to reflect the committed changes.
Closed by commit rL252487: Fixes to wait-loop code (authored by jlpeyton).

Changed prior to commit:
  http://reviews.llvm.org/D14458?vs=39569&id=39701#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D14458

Files:
  openmp/trunk/runtime/src/kmp_tasking.c
  openmp/trunk/runtime/src/kmp_wait_release.h
  openmp/trunk/runtime/src/z_Linux_util.c
  openmp/trunk/runtime/src/z_Windows_NT_util.c

Index: openmp/trunk/runtime/src/kmp_wait_release.h
===================================================================
--- openmp/trunk/runtime/src/kmp_wait_release.h
+++ openmp/trunk/runtime/src/kmp_wait_release.h
@@ -438,6 +438,7 @@
                             USE_ITT_BUILD_ARG(itt_sync_obj));
     }
     void release() { __kmp_release_template(this); }
+    flag_type get_ptr_type() { return flag32; }
 };
 
 class kmp_flag_64 : public kmp_basic_flag<kmp_uint64> {
@@ -458,6 +459,7 @@
                             USE_ITT_BUILD_ARG(itt_sync_obj));
     }
     void release() { __kmp_release_template(this); }
+    flag_type get_ptr_type() { return flag64; }
 };
 
 // Hierarchical 64-bit on-core barrier instantiation
@@ -551,6 +553,7 @@
     }
     kmp_uint8 *get_stolen() { return NULL; }
     enum barrier_type get_bt() { return bt; }
+    flag_type get_ptr_type() { return flag_oncore; }
 };
 
 
Index: openmp/trunk/runtime/src/z_Linux_util.c
===================================================================
--- openmp/trunk/runtime/src/z_Linux_util.c
+++ openmp/trunk/runtime/src/z_Linux_util.c
@@ -1837,11 +1837,12 @@
     status = pthread_mutex_lock( &th->th.th_suspend_mx.m_mutex );
     KMP_CHECK_SYSFAIL( "pthread_mutex_lock", status );
 
-    if (!flag) {
+    if (!flag) { // coming from __kmp_null_resume_wrapper
         flag = (C *)th->th.th_sleep_loc;
     }
 
-    if (!flag) {
+    // First, check if the flag is null or its type has changed. If so, someone else woke it up.
+    if (!flag || flag->get_type() != flag->get_ptr_type()) { // get_ptr_type simply shows what flag was cast to
         KF_TRACE( 5, ( "__kmp_resume_template: T#%d exiting, thread T#%d already awake: flag(%p)\n",
                        gtid, target_gtid, NULL ) );
         status = pthread_mutex_unlock( &th->th.th_suspend_mx.m_mutex );
Index: openmp/trunk/runtime/src/z_Windows_NT_util.c
===================================================================
--- openmp/trunk/runtime/src/z_Windows_NT_util.c
+++ openmp/trunk/runtime/src/z_Windows_NT_util.c
@@ -455,11 +455,12 @@
     __kmp_suspend_initialize_thread( th );
     __kmp_win32_mutex_lock( &th->th.th_suspend_mx );
 
-    if (!flag) {
+    if (!flag) { // coming from __kmp_null_resume_wrapper
         flag = (C *)th->th.th_sleep_loc;
     }
 
-    if (!flag) {
+    // First, check if the flag is null or its type has changed. If so, someone else woke it up.
+    if (!flag || flag->get_type() != flag->get_ptr_type()) { // get_ptr_type simply shows what flag was cast to
         KF_TRACE( 5, ( "__kmp_resume_template: T#%d exiting, thread T#%d already awake: flag's loc(%p)\n",
                        gtid, target_gtid, NULL ) );
         __kmp_win32_mutex_unlock( &th->th.th_suspend_mx );
Index: openmp/trunk/runtime/src/kmp_tasking.c
===================================================================
--- openmp/trunk/runtime/src/kmp_tasking.c
+++ openmp/trunk/runtime/src/kmp_tasking.c
@@ -39,6 +39,7 @@
 
 static inline void __kmp_null_resume_wrapper(int gtid, volatile void *flag) {
     if (!flag) return;
+    // Attempt to wake up a thread: examine its type and call appropriate template
     switch (((kmp_flag_64 *)flag)->get_type()) {
     case flag32: __kmp_resume_32(gtid, NULL); break;
     case flag64: __kmp_resume_64(gtid, NULL); break;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14458.39701.patch
Type: text/x-patch
Size: 3326 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20151109/c1edfa59/attachment.bin>


More information about the Openmp-commits mailing list