14 #include "absl/flags/internal/sequence_lock.h"
22 #include "gtest/gtest.h"
23 #include "absl/base/internal/sysinfo.h"
24 #include "absl/container/fixed_array.h"
25 #include "absl/time/clock.h"
31 class ConcurrentSequenceLockTest
34 ConcurrentSequenceLockTest()
35 : buf_bytes_(
std::
get<0>(GetParam())),
36 num_threads_(
std::
get<1>(GetParam())) {}
40 const int num_threads_;
43 TEST_P(ConcurrentSequenceLockTest, ReadAndWrite) {
49 for (
auto&
v : protected_buf)
v = -1;
52 std::atomic<bool>
stop{
false};
53 std::atomic<int64_t> bad_reads{0};
54 std::atomic<int64_t> good_reads{0};
55 std::atomic<int64_t> unsuccessful_reads{0};
61 std::vector<std::thread>
threads;
62 for (
int i = 0;
i < num_threads_;
i++) {
65 while (!
stop.load(std::memory_order_relaxed)) {
66 if (seq_lock.
TryRead(local_buf.data(), protected_buf.data(),
69 for (
const auto&
v : local_buf) {
70 if (
v != local_buf[0]) good =
false;
73 good_reads.fetch_add(1, std::memory_order_relaxed);
75 bad_reads.fetch_add(1, std::memory_order_relaxed);
78 unsuccessful_reads.fetch_add(1, std::memory_order_relaxed);
83 while (unsuccessful_reads.load(std::memory_order_relaxed) < num_threads_) {
92 for (
int i = 0;
i < 100 &&
absl::Now() < deadline;
i++) {
94 for (
auto&
v : writer_buf)
v =
i;
95 seq_lock.
Write(protected_buf.data(), writer_buf.data(), buf_bytes_);
98 stop.store(
true, std::memory_order_relaxed);
107 std::vector<int> MultiplicativeRange(
int low,
int high,
int scale) {
109 for (
int current = low; current < high; current *=
scale) {
110 result.push_back(current);
116 #ifndef ABSL_HAVE_THREAD_SANITIZER
126 std::vector<int> InterestingBufferSizes() {
127 std::vector<int>
ret;
128 for (
int v : MultiplicativeRange(1, 128, 2)) {
131 ret.push_back(
v - 1);
133 ret.push_back(
v + 1);
139 TestManyByteSizes, ConcurrentSequenceLockTest,
150 TEST_P(SequenceLockTest, SingleThreaded) {
151 const int size = GetParam();
158 std::vector<char> src_buf(
size,
'x');
159 seq_lock.
Write(protected_buf.data(), src_buf.data(),
size);
161 std::vector<char> dst_buf(
size,
'0');