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