aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2022-02-18 11:47:36 +0000
committerTor Brede Vekterli <vekterli@yahooinc.com>2022-02-18 11:50:24 +0000
commitcd06db02a21d6caa2de1570c111be0f283f94e1f (patch)
treef5a9dcfbdc8de83416e5760a32ca3e502a5bbe95
parent3828ea0a218497c92b1c4c3793ea6f2bc03f7988 (diff)
Make FNET_TransportThread IO components counter atomic
Only checked by tests, but no obvious existing mutex to synchronize around, so turn accesses into relaxed atomics (internal visibility otherwise guaranteed due to transport thread invocation semantics).
-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