#ifndef TSAN_VECTOR_CLOCK_H
#define TSAN_VECTOR_CLOCK_H
#include "tsan_defs.h"
namespace __tsan {
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:
VECTOR_ALIGNED Epoch clk_[kThreadSlotCount];
};
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;
}
}
#endif