xref: /netbsd-src/external/gpl3/gcc/dist/libsanitizer/tsan/tsan_mutexset.h (revision f14316bcbc544b96a93e884bc5c2b15fd60e22ae)
1 //===-- tsan_mutexset.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 // MutexSet holds the set of mutexes currently held by a thread.
11 //===----------------------------------------------------------------------===//
12 #ifndef TSAN_MUTEXSET_H
13 #define TSAN_MUTEXSET_H
14 
15 #include "tsan_defs.h"
16 
17 namespace __tsan {
18 
19 class MutexSet {
20  public:
21   // Holds limited number of mutexes.
22   // The oldest mutexes are discarded on overflow.
23   static const uptr kMaxSize = 64;
24   struct Desc {
25     u64 id;
26     u64 epoch;
27     int count;
28     bool write;
29   };
30 
31   MutexSet();
32   // The 'id' is obtained from SyncVar::GetId().
33   void Add(u64 id, bool write, u64 epoch);
34   void Del(u64 id, bool write);
35   void Remove(u64 id);  // Removes the mutex completely (if it's destroyed).
36   uptr Size() const;
37   Desc Get(uptr i) const;
38 
39  private:
40 #ifndef TSAN_GO
41   uptr size_;
42   Desc descs_[kMaxSize];
43 #endif
44 
45   void RemovePos(uptr i);
46 };
47 
48 // Go does not have mutexes, so do not spend memory and time.
49 // (Go sync.Mutex is actually a semaphore -- can be unlocked
50 // in different goroutine).
51 #ifdef TSAN_GO
52 MutexSet::MutexSet() {}
53 void MutexSet::Add(u64 id, bool write, u64 epoch) {}
54 void MutexSet::Del(u64 id, bool write) {}
55 void MutexSet::Remove(u64 id) {}
56 void MutexSet::RemovePos(uptr i) {}
57 uptr MutexSet::Size() const { return 0; }
58 MutexSet::Desc MutexSet::Get(uptr i) const { return Desc(); }
59 #endif
60 
61 }  // namespace __tsan
62 
63 #endif  // TSAN_REPORT_H
64