1 //===-- sanitizer_mutex.h ---------------------------------------*- C++ -*-===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is a part of ThreadSanitizer/AddressSanitizer runtime.
10 //===----------------------------------------------------------------------===//
12 #ifndef SANITIZER_MUTEX_H
13 #define SANITIZER_MUTEX_H
15 #include "sanitizer_atomic.h"
16 #include "sanitizer_internal_defs.h"
17 #include "sanitizer_libc.h"
19 namespace __sanitizer
{
21 class StaticSpinMutex
{
24 atomic_store(&state_
, 0, memory_order_relaxed
);
34 return atomic_exchange(&state_
, 1, memory_order_acquire
) == 0;
38 atomic_store(&state_
, 0, memory_order_release
);
42 CHECK_EQ(atomic_load(&state_
, memory_order_relaxed
), 1);
46 atomic_uint8_t state_
;
48 void NOINLINE
LockSlow() {
49 for (int i
= 0;; i
++) {
53 internal_sched_yield();
54 if (atomic_load(&state_
, memory_order_relaxed
) == 0
55 && atomic_exchange(&state_
, 1, memory_order_acquire
) == 0)
61 class SpinMutex
: public StaticSpinMutex
{
68 SpinMutex(const SpinMutex
&);
69 void operator=(const SpinMutex
&);
74 explicit BlockingMutex(LinkerInitialized
);
80 uptr opaque_storage_
[10];
81 uptr owner_
; // for debugging
84 template<typename MutexType
>
85 class GenericScopedLock
{
87 explicit GenericScopedLock(MutexType
*mu
)
92 ~GenericScopedLock() {
99 GenericScopedLock(const GenericScopedLock
&);
100 void operator=(const GenericScopedLock
&);
103 template<typename MutexType
>
104 class GenericScopedReadLock
{
106 explicit GenericScopedReadLock(MutexType
*mu
)
111 ~GenericScopedReadLock() {
118 GenericScopedReadLock(const GenericScopedReadLock
&);
119 void operator=(const GenericScopedReadLock
&);
122 typedef GenericScopedLock
<StaticSpinMutex
> SpinMutexLock
;
123 typedef GenericScopedLock
<BlockingMutex
> BlockingMutexLock
;
125 } // namespace __sanitizer
127 #endif // SANITIZER_MUTEX_H