#include "device/base/synchronization/one_writer_seqlock.h"
#include "base/threading/platform_thread.h"
namespace device {
OneWriterSeqLock::OneWriterSeqLock() : sequence_(0) {}
int32_t OneWriterSeqLock::ReadBegin(uint32_t max_retries) const {
int32_t version;
for (uint32_t i = 0; i <= max_retries; ++i) {
version = sequence_.load(std::memory_order_acquire);
if ((version & 1) == 0)
break;
if (i > 10)
base::PlatformThread::YieldCurrentThread();
}
return version;
}
bool OneWriterSeqLock::ReadRetry(int32_t version) const {
atomic_thread_fence(std::memory_order_acquire);
return sequence_.load(std::memory_order_relaxed) != version;
}
void OneWriterSeqLock::WriteBegin() {
int32_t version = sequence_.fetch_add(1, std::memory_order_relaxed);
atomic_thread_fence(std::memory_order_release);
DCHECK((version & 1) == 0);
}
void OneWriterSeqLock::WriteEnd() {
int32_t version = sequence_.fetch_add(1, std::memory_order_release);
DCHECK((version & 1) != 0);
}
}