[PATCH] D29728: Remove strict tid checks from the mac implementation of BlockingMutex

Francis Ricci via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 9 09:13:50 PST 2017


fjricci updated this revision to Diff 87822.
fjricci added a comment.

Add comment explaining CheckLocked behavior


https://reviews.llvm.org/D29728

Files:
  lib/sanitizer_common/sanitizer_mac.cc


Index: lib/sanitizer_common/sanitizer_mac.cc
===================================================================
--- lib/sanitizer_common/sanitizer_mac.cc
+++ lib/sanitizer_common/sanitizer_mac.cc
@@ -348,20 +348,22 @@
 void BlockingMutex::Lock() {
   CHECK(sizeof(OSSpinLock) <= sizeof(opaque_storage_));
   CHECK_EQ(OS_SPINLOCK_INIT, 0);
-  CHECK_NE(owner_, (uptr)pthread_self());
+  CHECK_EQ(owner_, 0);
   OSSpinLockLock((OSSpinLock*)&opaque_storage_);
-  CHECK(!owner_);
-  owner_ = (uptr)pthread_self();
 }
 
 void BlockingMutex::Unlock() {
-  CHECK(owner_ == (uptr)pthread_self());
-  owner_ = 0;
   OSSpinLockUnlock((OSSpinLock*)&opaque_storage_);
 }
 
+// This function explicitly avoids checking whether the mutex is owned by
+// the calling thread. This behavior, while more strictly correct, causes
+// problems in cases like StopTheWorld, where a parent thread owns the mutex
+// but a child checks that it is locked. Rather than maintaining complex state
+// to work around those situations, the check only checks that the mutex is
+// owned, and assumes callers to be generally well-behaved.
 void BlockingMutex::CheckLocked() {
-  CHECK_EQ((uptr)pthread_self(), owner_);
+  CHECK_NE(*(OSSpinLock*)&opaque_storage_, 0);
 }
 
 u64 NanoTime() {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29728.87822.patch
Type: text/x-patch
Size: 1258 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170209/ecc5a7b4/attachment.bin>


More information about the llvm-commits mailing list