From 0c645c88164bc29c64aaa1861b73aaaae443e075 Mon Sep 17 00:00:00 2001 From: Tor Brede Vekterli Date: Thu, 17 Feb 2022 12:45:53 +0000 Subject: Make finished-polling outside of lock thread safe --- fnet/src/vespa/fnet/transport_thread.cpp | 10 +++++----- fnet/src/vespa/fnet/transport_thread.h | 6 +++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/fnet/src/vespa/fnet/transport_thread.cpp b/fnet/src/vespa/fnet/transport_thread.cpp index 53f8fea40cd..1d55ac3b327 100644 --- a/fnet/src/vespa/fnet/transport_thread.cpp +++ b/fnet/src/vespa/fnet/transport_thread.cpp @@ -236,7 +236,7 @@ FNET_TransportThread::~FNET_TransportThread() { std::lock_guard guard(_shutdownLock); } - if (_started.load() && !_finished) { + if (_started.load() && !is_finished()) { LOG(error, "Transport: delete called on active object!"); } else { std::lock_guard guard(_pseudo_thread); @@ -380,11 +380,11 @@ FNET_TransportThread::ShutDown(bool waitFinished) void FNET_TransportThread::WaitFinished() { - if (_finished) + if (is_finished()) return; std::unique_lock guard(_shutdownLock); - while (!_finished) + while (!is_finished()) _shutdownCond.wait(guard); } @@ -501,7 +501,7 @@ FNET_TransportThread::EventLoopIteration() { if (!IsShutDown()) return true; - if (_finished) + if (is_finished()) return false; endEventLoop(); @@ -557,7 +557,7 @@ FNET_TransportThread::endEventLoop() { { std::lock_guard guard(_shutdownLock); - _finished = true; + _finished.store(true, std::memory_order_relaxed); _shutdownCond.notify_all(); } diff --git a/fnet/src/vespa/fnet/transport_thread.h b/fnet/src/vespa/fnet/transport_thread.h index cf1f68a8b39..dfdcf4e1970 100644 --- a/fnet/src/vespa/fnet/transport_thread.h +++ b/fnet/src/vespa/fnet/transport_thread.h @@ -50,7 +50,7 @@ private: std::recursive_mutex _pseudo_thread; // used after transport thread has shut down std::atomic _started; // event loop started ? std::atomic _shutdown; // should stop event loop ? - bool _finished; // event loop stopped ? + std::atomic _finished; // event loop stopped ? /** * Add an IOComponent to the list of components. This operation is @@ -173,6 +173,10 @@ private: return _shutdown.load(std::memory_order_relaxed); } + [[nodiscard]] bool is_finished() const noexcept { + return _finished.load(std::memory_order_relaxed); + } + public: FNET_TransportThread(const FNET_TransportThread &) = delete; FNET_TransportThread &operator=(const FNET_TransportThread &) = delete; -- cgit v1.2.3