xref: /netbsd-src/external/gpl3/gcc.old/dist/libsanitizer/tsan/tsan_clock.h (revision 6cd39ddb8550f6fa1bff3fed32053d7f19fd0453)
1 //===-- tsan_clock.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_CLOCK_H
12 #define TSAN_CLOCK_H
13 
14 #include "tsan_defs.h"
15 #include "tsan_vector.h"
16 
17 namespace __tsan {
18 
19 // The clock that lives in sync variables (mutexes, atomics, etc).
20 class SyncClock {
21  public:
22   SyncClock();
23 
24   uptr size() const {
25     return clk_.Size();
26   }
27 
28   void Reset() {
29     clk_.Reset();
30   }
31 
32  private:
33   Vector<u64> clk_;
34   friend struct ThreadClock;
35 };
36 
37 // The clock that lives in threads.
38 struct ThreadClock {
39  public:
40   ThreadClock();
41 
42   u64 get(unsigned tid) const {
43     DCHECK_LT(tid, kMaxTidInClock);
44     return clk_[tid];
45   }
46 
47   void set(unsigned tid, u64 v) {
48     DCHECK_LT(tid, kMaxTid);
49     DCHECK_GE(v, clk_[tid]);
50     clk_[tid] = v;
51     if (nclk_ <= tid)
52       nclk_ = tid + 1;
53   }
54 
55   void tick(unsigned tid) {
56     DCHECK_LT(tid, kMaxTid);
57     clk_[tid]++;
58     if (nclk_ <= tid)
59       nclk_ = tid + 1;
60   }
61 
62   uptr size() const {
63     return nclk_;
64   }
65 
66   void acquire(const SyncClock *src);
67   void release(SyncClock *dst) const;
68   void acq_rel(SyncClock *dst);
69   void ReleaseStore(SyncClock *dst) const;
70 
71  private:
72   uptr nclk_;
73   u64 clk_[kMaxTidInClock];
74 };
75 
76 }  // namespace __tsan
77 
78 #endif  // TSAN_CLOCK_H
79