]>
Commit | Line | Data |
---|---|---|
cd0be65c WM |
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 | ||
cd0be65c WM |
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 |