diff options
author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2016-06-28 19:37:24 +0000 |
---|---|---|
committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2016-06-28 19:37:24 +0000 |
commit | ac7ba406edca6d17ce41bc25cef36b649a71e1d2 (patch) | |
tree | 55895243a317366142fd9d718f52738b10fba452 /openmp | |
parent | cceebeef1781b9b41e6d9a48f0bdfe37580f4840 (diff) | |
download | bcm5719-llvm-ac7ba406edca6d17ce41bc25cef36b649a71e1d2.tar.gz bcm5719-llvm-ac7ba406edca6d17ce41bc25cef36b649a71e1d2.zip |
Fix bugs in TAS and futex lock
* Incorrect lock value written in __kmp_test_futex_lock
* Incorrect lock value check in tas/futex lock with USE_LOCK_PROFILE on
Patch by Hansang Bae
llvm-svn: 274053
Diffstat (limited to 'openmp')
-rw-r--r-- | openmp/runtime/src/kmp_lock.cpp | 6 | ||||
-rw-r--r-- | openmp/runtime/test/lock/omp_test_lock.c | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/openmp/runtime/src/kmp_lock.cpp b/openmp/runtime/src/kmp_lock.cpp index e5fd601a2d9..2cca61105e3 100644 --- a/openmp/runtime/src/kmp_lock.cpp +++ b/openmp/runtime/src/kmp_lock.cpp @@ -91,7 +91,7 @@ __kmp_acquire_tas_lock_timed_template( kmp_tas_lock_t *lck, kmp_int32 gtid ) KMP_MB(); #ifdef USE_LOCK_PROFILE - kmp_uint32 curr = TCR_4( lck->lk.poll ); + kmp_uint32 curr = KMP_LOCK_STRIP( TCR_4( lck->lk.poll ) ); if ( ( curr != 0 ) && ( curr != gtid + 1 ) ) __kmp_printf( "LOCK CONTENTION: %p\n", lck ); /* else __kmp_printf( "." );*/ @@ -393,7 +393,7 @@ __kmp_acquire_futex_lock_timed_template( kmp_futex_lock_t *lck, kmp_int32 gtid ) KMP_MB(); #ifdef USE_LOCK_PROFILE - kmp_uint32 curr = TCR_4( lck->lk.poll ); + kmp_uint32 curr = KMP_LOCK_STRIP( TCR_4( lck->lk.poll ) ); if ( ( curr != 0 ) && ( curr != gtid_code ) ) __kmp_printf( "LOCK CONTENTION: %p\n", lck ); /* else __kmp_printf( "." );*/ @@ -487,7 +487,7 @@ __kmp_acquire_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid ) int __kmp_test_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid ) { - if ( KMP_COMPARE_AND_STORE_ACQ32( & ( lck->lk.poll ), KMP_LOCK_FREE(futex), KMP_LOCK_BUSY(gtid+1, futex) << 1 ) ) { + if ( KMP_COMPARE_AND_STORE_ACQ32( & ( lck->lk.poll ), KMP_LOCK_FREE(futex), KMP_LOCK_BUSY((gtid+1) << 1, futex) ) ) { KMP_FSYNC_ACQUIRED( lck ); return TRUE; } diff --git a/openmp/runtime/test/lock/omp_test_lock.c b/openmp/runtime/test/lock/omp_test_lock.c index 40111393416..c5120552702 100644 --- a/openmp/runtime/test/lock/omp_test_lock.c +++ b/openmp/runtime/test/lock/omp_test_lock.c @@ -1,4 +1,6 @@ // RUN: %libomp-compile-and-run +// RUN: env KMP_LOCK_KIND=tas %libomp-run +// RUN: env KMP_LOCK_KIND=futex %libomp-run #include <stdio.h> #include "omp_testsuite.h" |