aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/util/rcuvector/rcuvector_test.cpp
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2023-07-10 10:27:08 +0200
committerTor Egge <Tor.Egge@online.no>2023-07-10 10:27:08 +0200
commit0c654b649fd5797da992398d9ba56435fae3f123 (patch)
tree2d2c4b3e6b36d4feda717c1cc18ab5eb7220d983 /vespalib/src/tests/util/rcuvector/rcuvector_test.cpp
parent2b9f22bbeb54a97a80bb2f241ab29dbb81ca3edb (diff)
Avoid livelock when running rcu vector unit test with valgrind.
Diffstat (limited to 'vespalib/src/tests/util/rcuvector/rcuvector_test.cpp')
-rw-r--r--vespalib/src/tests/util/rcuvector/rcuvector_test.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/vespalib/src/tests/util/rcuvector/rcuvector_test.cpp b/vespalib/src/tests/util/rcuvector/rcuvector_test.cpp
index b842d009ce8..2c5af5c02ec 100644
--- a/vespalib/src/tests/util/rcuvector/rcuvector_test.cpp
+++ b/vespalib/src/tests/util/rcuvector/rcuvector_test.cpp
@@ -10,6 +10,7 @@
#include <vespa/vespalib/util/size_literals.h>
#include <vespa/vespalib/util/threadstackexecutor.h>
#include <random>
+#include <thread>
using namespace vespalib;
@@ -20,6 +21,18 @@ using vespalib::makeLambdaTask;
using MyMemoryAllocator = vespalib::alloc::test::MemoryAllocatorObserver;
using AllocStats = MyMemoryAllocator::Stats;
+namespace {
+
+void consider_yield(uint32_t i)
+{
+ if ((i % 1111) == 0) {
+ // Need to yield sometimes to avoid livelock when running unit test with valgrind
+ std::this_thread::yield();
+ }
+}
+
+}
+
bool
assertUsage(const MemoryUsage & exp, const MemoryUsage & act)
{
@@ -452,12 +465,15 @@ StressFixture::read_work()
std::mt19937 gen(rd());
std::uniform_int_distribution<uint32_t> distrib(0, read_area - 1);
std::vector<int> old(read_area);
+ uint32_t i = 0;
while (!stop_read.load(std::memory_order_relaxed)) {
uint32_t idx = distrib(gen);
auto guard = generation_handler.takeGuard();
int value = arr.acquire_elem_ref(idx).load_acquire();
EXPECT_LE(old[idx], value);
old[idx] = value;
+ consider_yield(i);
+ ++i;
}
}
@@ -478,6 +494,7 @@ StressFixture::write_work(uint32_t cnt)
uint32_t idx = distrib(gen);
arr[idx].store_release(arr[idx].load_relaxed() + 1);
commit();
+ consider_yield(i);
}
}