diff options
-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 |