//===-- sanitizer_mutex.h ---------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of ThreadSanitizer/AddressSanitizer runtime. // //===----------------------------------------------------------------------===// #ifndef SANITIZER_MUTEX_H #define SANITIZER_MUTEX_H #include "sanitizer_atomic.h" #include "sanitizer_internal_defs.h" #include "sanitizer_libc.h" #include "sanitizer_thread_safety.h" namespace __sanitizer { class SANITIZER_MUTEX StaticSpinMutex { … }; class SANITIZER_MUTEX SpinMutex : public StaticSpinMutex { … }; // Semaphore provides an OS-dependent way to park/unpark threads. // The last thread returned from Wait can destroy the object // (destruction-safety). class Semaphore { … }; MutexType; enum { … }; // Go linker does not support THREADLOCAL variables, // so we can't use per-thread state. // Disable checked locks on Darwin. Although Darwin platforms support // THREADLOCAL variables they are not usable early on during process init when // `__sanitizer::Mutex` is used. #define SANITIZER_CHECK_DEADLOCKS … #if SANITIZER_CHECK_DEADLOCKS struct MutexMeta { MutexType type; const char *name; // The table fixes what mutexes can be locked under what mutexes. // If the entry for MutexTypeFoo contains MutexTypeBar, // then Bar mutex can be locked while under Foo mutex. // Can also contain the special MutexLeaf/MutexMulti marks. MutexType can_lock[10]; }; #endif class CheckedMutex { … }; // Reader-writer mutex. // Derive from CheckedMutex for the purposes of EBO. // We could make it a field marked with [[no_unique_address]], // but this attribute is not supported by some older compilers. class SANITIZER_MUTEX Mutex : CheckedMutex { … }; void FutexWait(atomic_uint32_t *p, u32 cmp); void FutexWake(atomic_uint32_t *p, u32 count); template <typename MutexType> class SANITIZER_SCOPED_LOCK GenericScopedLock { … }; template <typename MutexType> class SANITIZER_SCOPED_LOCK GenericScopedReadLock { … }; template <typename MutexType> class SANITIZER_SCOPED_LOCK GenericScopedRWLock { … }; SpinMutexLock; Lock; ReadLock; RWLock; } // namespace __sanitizer #endif // SANITIZER_MUTEX_H