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

Jonathan Peyton via Openmp-commits openmp-commits at lists.llvm.org
Fri Nov 6 11:34:34 PST 2015


jlpeyton created this revision.
jlpeyton added reviewers: tlwilmar, AndreyChurbanov, hfinkel.
jlpeyton added a subscriber: openmp-commits.
jlpeyton set the repository for this revision to rL LLVM.

1. Add `get_ptr_type()` method to all wait flag types.
2. Flag in `sleep_loc` may change type by the time the resume is called from
   `__kmp_null_resume_wrapper`.  We use `get_ptr_type` to obtain the real type
   and compare it to the casted object received. If they don't match, we know
   the flag has changed (already resumed and replaced by another flag).  If
   they match, it doesn't hurt to go ahead and resume it.

Repository:
  rL LLVM

http://reviews.llvm.org/D14458

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

Index: runtime/src/z_Windows_NT_util.c
===================================================================
--- runtime/src/z_Windows_NT_util.c
+++ 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: runtime/src/z_Linux_util.c
===================================================================
--- runtime/src/z_Linux_util.c
+++ 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: runtime/src/kmp_wait_release.h
===================================================================
--- runtime/src/kmp_wait_release.h
+++ 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: runtime/src/kmp_tasking.c
===================================================================
--- runtime/src/kmp_tasking.c
+++ 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.39569.patch
Type: text/x-patch
Size: 3170 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20151106/6640d408/attachment-0001.bin>


More information about the Openmp-commits mailing list