aboutsummaryrefslogtreecommitdiffstats
path: root/fnet
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2022-02-17 12:45:53 +0000
committerTor Brede Vekterli <vekterli@yahooinc.com>2022-02-18 15:38:33 +0000
commit0c645c88164bc29c64aaa1861b73aaaae443e075 (patch)
treef84c1dcf59b22624f94677ca2adcab8e5432e529 /fnet
parenta0806ea0ee6941e31538033bfb2bc6c8421beddb (diff)
Make finished-polling outside of lock thread safe
Diffstat (limited to 'fnet')
-rw-r--r--fnet/src/vespa/fnet/transport_thread.cpp10
-rw-r--r--fnet/src/vespa/fnet/transport_thread.h6
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<std::mutex> 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<std::mutex> 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<std::mutex> 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<bool> _started; // event loop started ?
std::atomic<bool> _shutdown; // should stop event loop ?
- bool _finished; // event loop stopped ?
+ std::atomic<bool> _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;