From 3fdd27efcad094d8218f298246cd1542317b7b2e Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 9 Feb 2026 11:36:46 +0100 Subject: [PATCH 1/2] Fix ReverseInterfaceTest.handle_program_state Attempting to fix thread synchronization. I'm not entirely sure that that's the problem as I cannot reprocude things locally and the output suggests that there's a client connecting twice, but it's something that could be fixed. --- tests/test_reverse_interface.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/tests/test_reverse_interface.cpp b/tests/test_reverse_interface.cpp index a365b6dd..b2407031 100644 --- a/tests/test_reverse_interface.cpp +++ b/tests/test_reverse_interface.cpp @@ -202,19 +202,36 @@ class ReverseIntefaceTest : public ::testing::Test void handleProgramState(bool program_state) { std::lock_guard lk(program_running_mutex_); - program_running_.notify_one(); + new_program_state_received_ = true; program_state_ = program_state; + program_running_.notify_one(); } bool waitForProgramState(int milliseconds = 100, bool program_state = true) { + // If the expected state is given already, return immediately + if (program_state_ == program_state) + { + return true; + } + + // Wait for new state until timeout has elapsed std::unique_lock lk(program_running_mutex_); - if (program_running_.wait_for(lk, std::chrono::milliseconds(milliseconds)) == std::cv_status::no_timeout || - program_state_ == program_state) + std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + while ( + program_state_ != program_state && + std::chrono::duration_cast(std::chrono::steady_clock::now() - start_time).count() < + milliseconds) { - if (program_state_ == program_state) + if (program_running_.wait_for(lk, std::chrono::milliseconds(milliseconds / 10), + [this] { return new_program_state_received_.load(); })) { - return true; + new_program_state_received_ = false; + // Check whether the new state matches the expected state + if (program_state_ == program_state) + { + return true; + } } } return false; @@ -225,6 +242,7 @@ class ReverseIntefaceTest : public ::testing::Test private: std::atomic program_state_ = ATOMIC_VAR_INIT(false); + std::atomic new_program_state_received_ = ATOMIC_VAR_INIT(false); std::condition_variable program_running_; std::mutex program_running_mutex_; }; From 67fe8fa0e910a3707079a82b39b8a7b8363b65ed Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 9 Feb 2026 11:46:28 +0100 Subject: [PATCH 2/2] Simplify logic --- tests/test_reverse_interface.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/test_reverse_interface.cpp b/tests/test_reverse_interface.cpp index b2407031..dee96cd2 100644 --- a/tests/test_reverse_interface.cpp +++ b/tests/test_reverse_interface.cpp @@ -209,12 +209,6 @@ class ReverseIntefaceTest : public ::testing::Test bool waitForProgramState(int milliseconds = 100, bool program_state = true) { - // If the expected state is given already, return immediately - if (program_state_ == program_state) - { - return true; - } - // Wait for new state until timeout has elapsed std::unique_lock lk(program_running_mutex_); std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); @@ -234,7 +228,7 @@ class ReverseIntefaceTest : public ::testing::Test } } } - return false; + return program_state_ == program_state; } std::unique_ptr reverse_interface_;