summaryrefslogtreecommitdiffstats
path: root/fnet
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@oath.com>2019-01-10 14:45:41 +0000
committerTor Brede Vekterli <vekterli@oath.com>2019-01-10 14:45:41 +0000
commit209adc1be4f17d95850f8a6c4ca9d1dc38103817 (patch)
tree25672f7e73c846df8318f5faad61ee6ec572be07 /fnet
parentc540dd41dc5af04b4e81c6f82e894740cdde9dad (diff)
Use relaxed atomics for FNET_TransportThread shutdown flag
Diffstat (limited to 'fnet')
-rw-r--r--fnet/src/vespa/fnet/transport_thread.cpp10
-rw-r--r--fnet/src/vespa/fnet/transport_thread.h7
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