From 209adc1be4f17d95850f8a6c4ca9d1dc38103817 Mon Sep 17 00:00:00 2001 From: Tor Brede Vekterli Date: Thu, 10 Jan 2019 14:45:41 +0000 Subject: Use relaxed atomics for FNET_TransportThread shutdown flag --- fnet/src/vespa/fnet/transport_thread.cpp | 10 +++++----- fnet/src/vespa/fnet/transport_thread.h | 7 ++++++- 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'fnet') diff --git a/fnet/src/vespa/fnet/transport_thread.cpp b/fnet/src/vespa/fnet/transport_thread.cpp index b38e2f0aa08..8ee33ad7960 100644 --- a/fnet/src/vespa/fnet/transport_thread.cpp +++ b/fnet/src/vespa/fnet/transport_thread.cpp @@ -116,7 +116,7 @@ FNET_TransportThread::PostEvent(FNET_ControlPacket *cpacket, bool wasEmpty; { std::unique_lock guard(_lock); - if (_shutdown) { + if (IsShutDown()) { guard.unlock(); SafeDiscardEvent(cpacket, context); return false; @@ -381,8 +381,8 @@ FNET_TransportThread::ShutDown(bool waitFinished) bool wasEmpty = false; { std::lock_guard guard(_lock); - if (!_shutdown) { - _shutdown = true; + if (!IsShutDown()) { + _shutdown.store(true, std::memory_order_relaxed); wasEmpty = _queue.IsEmpty_NoLock(); } } @@ -519,7 +519,7 @@ FNET_TransportThread::EventLoopIteration() FastOS_Time beforeGetEvents; #endif - if (!_shutdown) { + if (!IsShutDown()) { #ifdef FNET_SANITY_CHECKS // Warn if event loop takes more than 250ms @@ -569,7 +569,7 @@ FNET_TransportThread::EventLoopIteration() FlushDeleteList(); } // -- END OF MAIN EVENT LOOP -- - if (!_shutdown) + if (!IsShutDown()) return true; if (_finished) return false; diff --git a/fnet/src/vespa/fnet/transport_thread.h b/fnet/src/vespa/fnet/transport_thread.h index 86c7cf1dfcd..ffbbb7acc0f 100644 --- a/fnet/src/vespa/fnet/transport_thread.h +++ b/fnet/src/vespa/fnet/transport_thread.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -48,7 +49,7 @@ private: std::condition_variable _cond; // used for synchronization std::recursive_mutex _pseudo_thread; // used after transport thread has shut down bool _started; // event loop started ? - bool _shutdown; // should stop event loop ? + std::atomic _shutdown; // should stop event loop ? bool _finished; // event loop stopped ? bool _waitFinished; // someone is waiting for _finished bool _deleted; // destructor called ? @@ -171,6 +172,10 @@ private: **/ bool EventLoopIteration(); + bool IsShutDown() const noexcept { + return _shutdown.load(std::memory_order_relaxed); + } + public: /** * Construct a transport object. To activate your newly created -- cgit v1.2.3