1 //===-- tsan_mutex.h --------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is a part of ThreadSanitizer (TSan), a race detector. 10 // 11 //===----------------------------------------------------------------------===// 12 #ifndef TSAN_MUTEX_H 13 #define TSAN_MUTEX_H 14 15 #include "sanitizer_common/sanitizer_atomic.h" 16 #include "sanitizer_common/sanitizer_mutex.h" 17 #include "tsan_defs.h" 18 19 namespace __tsan { 20 21 enum MutexType { 22 MutexTypeInvalid, 23 MutexTypeTrace, 24 MutexTypeThreads, 25 MutexTypeReport, 26 MutexTypeSyncVar, 27 MutexTypeSyncTab, 28 MutexTypeSlab, 29 MutexTypeAnnotations, 30 MutexTypeAtExit, 31 MutexTypeMBlock, 32 MutexTypeJavaMBlock, 33 MutexTypeDDetector, 34 MutexTypeFired, 35 MutexTypeRacy, 36 MutexTypeGlobalProc, 37 38 // This must be the last. 39 MutexTypeCount 40 }; 41 42 class Mutex { 43 public: 44 explicit Mutex(MutexType type, StatType stat_type); 45 ~Mutex(); 46 47 void Lock(); 48 void Unlock(); 49 50 void ReadLock(); 51 void ReadUnlock(); 52 53 void CheckLocked(); 54 55 private: 56 atomic_uintptr_t state_; 57 #if SANITIZER_DEBUG 58 MutexType type_; 59 #endif 60 #if TSAN_COLLECT_STATS 61 StatType stat_type_; 62 #endif 63 64 Mutex(const Mutex&); 65 void operator = (const Mutex&); 66 }; 67 68 typedef GenericScopedLock<Mutex> Lock; 69 typedef GenericScopedReadLock<Mutex> ReadLock; 70 71 class InternalDeadlockDetector { 72 public: 73 InternalDeadlockDetector(); 74 void Lock(MutexType t); 75 void Unlock(MutexType t); 76 void CheckNoLocks(); 77 private: 78 u64 seq_; 79 u64 locked_[MutexTypeCount]; 80 }; 81 82 void InitializeMutex(); 83 84 // Checks that the current thread does not hold any runtime locks 85 // (e.g. when returning from an interceptor). 86 void CheckNoLocks(ThreadState *thr); 87 88 } // namespace __tsan 89 90 #endif // TSAN_MUTEX_H 91