123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- //===-- tsan_vector_clock.h -------------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is a part of ThreadSanitizer (TSan), a race detector.
- //
- //===----------------------------------------------------------------------===//
- #ifndef TSAN_VECTOR_CLOCK_H
- #define TSAN_VECTOR_CLOCK_H
- #include "tsan_defs.h"
- namespace __tsan {
- // Fixed-size vector clock, used both for threads and sync objects.
- class VectorClock {
- public:
- VectorClock();
- Epoch Get(Sid sid) const;
- void Set(Sid sid, Epoch v);
- void Reset();
- void Acquire(const VectorClock* src);
- void Release(VectorClock** dstp) const;
- void ReleaseStore(VectorClock** dstp) const;
- void ReleaseStoreAcquire(VectorClock** dstp);
- void ReleaseAcquire(VectorClock** dstp);
- VectorClock& operator=(const VectorClock& other);
- private:
- Epoch clk_[kThreadSlotCount] VECTOR_ALIGNED;
- };
- ALWAYS_INLINE Epoch VectorClock::Get(Sid sid) const {
- return clk_[static_cast<u8>(sid)];
- }
- ALWAYS_INLINE void VectorClock::Set(Sid sid, Epoch v) {
- DCHECK_GE(v, clk_[static_cast<u8>(sid)]);
- clk_[static_cast<u8>(sid)] = v;
- }
- } // namespace __tsan
- #endif // TSAN_VECTOR_CLOCK_H
|