Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / libsanitizer / tsan / tsan_clock.h
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