]> git.ipfire.org Git - thirdparty/gcc.git/blame - libsanitizer/tsan/tsan_clock.h
[libsanitizer] merge from upstream r168514
[thirdparty/gcc.git] / libsanitizer / tsan / tsan_clock.h
CommitLineData
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
17namespace __tsan {
18
19// The clock that lives in sync variables (mutexes, atomics, etc).
20class 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.
38struct 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