[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