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