[llvm-commits] [compiler-rt] r159518 - /compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h

Dmitry Vyukov dvyukov at google.com
Mon Jul 2 00:09:21 PDT 2012


Author: dvyukov
Date: Mon Jul  2 02:09:21 2012
New Revision: 159518

URL: http://llvm.org/viewvc/llvm-project?rev=159518&view=rev
Log:
asan/tsan: improve SpinMutex

Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h?rev=159518&r1=159517&r2=159518&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mutex.h Mon Jul  2 02:09:21 2012
@@ -14,8 +14,9 @@
 #ifndef SANITIZER_MUTEX_H
 #define SANITIZER_MUTEX_H
 
-#include "sanitizer_internal_defs.h"
 #include "sanitizer_atomic.h"
+#include "sanitizer_internal_defs.h"
+#include "sanitizer_libc.h"
 
 namespace __sanitizer {
 
@@ -26,8 +27,9 @@
   }
 
   void Lock() {
-    while (atomic_exchange(&state_, 1, memory_order_acquire))
-      proc_yield(10);
+    if (atomic_exchange(&state_, 1, memory_order_acquire) == 0)
+      return;
+    LockSlow();
   }
 
   void Unlock() {
@@ -37,6 +39,18 @@
  private:
   atomic_uint8_t state_;
 
+  void NOINLINE LockSlow() {
+    for (int i = 0;; i++) {
+      if (i < 10)
+        proc_yield(10);
+      else
+        internal_sched_yield();
+      if (atomic_load(&state_, memory_order_relaxed) == 0
+          && atomic_exchange(&state_, 1, memory_order_acquire) == 0)
+        return;
+    }
+  }
+
   SpinMutex(const SpinMutex&);
   void operator=(const SpinMutex&);
 };





More information about the llvm-commits mailing list