diff options
author | Tor Brede Vekterli <vekterli@oath.com> | 2019-01-10 14:45:41 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@oath.com> | 2019-01-10 14:45:41 +0000 |
commit | 209adc1be4f17d95850f8a6c4ca9d1dc38103817 (patch) | |
tree | 25672f7e73c846df8318f5faad61ee6ec572be07 /fnet | |
parent | c540dd41dc5af04b4e81c6f82e894740cdde9dad (diff) |
Use relaxed atomics for FNET_TransportThread shutdown flag
Diffstat (limited to 'fnet')
-rw-r--r-- | fnet/src/vespa/fnet/transport_thread.cpp | 10 | ||||
-rw-r--r-- | fnet/src/vespa/fnet/transport_thread.h | 7 |
2 files changed, 11 insertions, 6 deletions
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<std::mutex> 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<std::mutex> 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 <vespa/fastos/time.h> #include <vespa/vespalib/net/socket_handle.h> #include <vespa/vespalib/net/selector.h> +#include <atomic> #include <mutex> #include <condition_variable> @@ -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<bool> _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 |