diff options
author | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-02-18 11:47:36 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-02-18 11:50:24 +0000 |
commit | cd06db02a21d6caa2de1570c111be0f283f94e1f (patch) | |
tree | f5a9dcfbdc8de83416e5760a32ca3e502a5bbe95 | |
parent | 3828ea0a218497c92b1c4c3793ea6f2bc03f7988 (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.cpp | 10 | ||||
-rw-r--r-- | fnet/src/vespa/fnet/transport_thread.h | 6 |
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 |