summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2022-02-18 14:53:41 +0100
committerGitHub <noreply@github.com>2022-02-18 14:53:41 +0100
commitf21e73ccb973968da652e4a93fe8c0d4f031a5c7 (patch)
treec9aed3977bde94d9818e14d35398aadb3362a60c
parent9e1f8efebce424061dc6ccd2b726710bdb783a5d (diff)
parentcd06db02a21d6caa2de1570c111be0f283f94e1f (diff)
Merge pull request #21273 from vespa-engine/vekterli/make-fnet-io-components-count-atomic
Make FNET_TransportThread IO components counter atomic
-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 8a0f3a8534a..53f8fea40cd 100644
--- a/fnet/src/vespa/fnet/transport_thread.cpp
+++ b/fnet/src/vespa/fnet/transport_thread.cpp
@@ -9,6 +9,7 @@
#include "transport.h"
#include <vespa/vespalib/net/socket_spec.h>
#include <vespa/vespalib/net/server_socket.h>
+#include <vespa/vespalib/util/atomic.h>
#include <vespa/vespalib/util/gate.h>
#include <csignal>
@@ -19,6 +20,7 @@ using vespalib::ServerSocket;
using vespalib::SocketHandle;
using vespalib::SocketSpec;
using vespalib::steady_clock;
+using namespace vespalib::atomic;
namespace {
@@ -46,7 +48,7 @@ FNET_TransportThread::AddComponent(FNET_IOComponent *comp)
_componentsTail = comp;
if (_timeOutHead == nullptr)
_timeOutHead = comp;
- _componentCnt++;
+ store_relaxed(_componentCnt, load_relaxed(_componentCnt) + 1);
} else {
comp->_ioc_prev = nullptr;
comp->_ioc_next = _componentsHead;
@@ -56,7 +58,7 @@ FNET_TransportThread::AddComponent(FNET_IOComponent *comp)
_componentsHead->_ioc_prev = comp;
}
_componentsHead = comp;
- _componentCnt++;
+ store_relaxed(_componentCnt, load_relaxed(_componentCnt) + 1);
}
}
@@ -74,7 +76,7 @@ FNET_TransportThread::RemoveComponent(FNET_IOComponent *comp)
comp->_ioc_prev->_ioc_next = comp->_ioc_next;
if (comp->_ioc_next != nullptr)
comp->_ioc_next->_ioc_prev = comp->_ioc_prev;
- _componentCnt--;
+ store_relaxed(_componentCnt, load_relaxed(_componentCnt) - 1);
}
@@ -549,7 +551,7 @@ FNET_TransportThread::endEventLoop() {
assert(_componentsHead == nullptr &&
_componentsTail == nullptr &&
_timeOutHead == nullptr &&
- _componentCnt == 0 &&
+ load_relaxed(_componentCnt) == 0 &&
_queue.IsEmpty_NoLock() &&
_myQueue.IsEmpty_NoLock());
diff --git a/fnet/src/vespa/fnet/transport_thread.h b/fnet/src/vespa/fnet/transport_thread.h
index 4452eba2825..cf1f68a8b39 100644
--- a/fnet/src/vespa/fnet/transport_thread.h
+++ b/fnet/src/vespa/fnet/transport_thread.h
@@ -39,7 +39,7 @@ private:
FNET_IOComponent *_componentsHead; // I/O component list head
FNET_IOComponent *_timeOutHead; // first IOC in list to time out
FNET_IOComponent *_componentsTail; // I/O component list tail
- uint32_t _componentCnt; // # of components
+ std::atomic<uint32_t> _componentCnt; // # of components
FNET_IOComponent *_deleteList; // IOC delete list
Selector _selector; // I/O event generator
FNET_PacketQueue_NoLock _queue; // outer event queue
@@ -266,7 +266,9 @@ public:
*
* @return the current number of IOComponents.
**/
- uint32_t GetNumIOComponents() { return _componentCnt; }
+ uint32_t GetNumIOComponents() const noexcept {
+ return _componentCnt.load(std::memory_order_relaxed);
+ }
/**
* Add an I/O component to the working set of this transport