From 0c654b649fd5797da992398d9ba56435fae3f123 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Mon, 10 Jul 2023 10:27:08 +0200 Subject: Avoid livelock when running rcu vector unit test with valgrind. --- vespalib/src/tests/util/rcuvector/rcuvector_test.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'vespalib/src/tests/util/rcuvector/rcuvector_test.cpp') 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 #include #include +#include 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 distrib(0, read_area - 1); std::vector 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); } } -- cgit v1.2.3