diff --git a/src/sysview/HostWS.cpp b/src/sysview/HostWS.cpp index c89c6097..8295dca3 100644 --- a/src/sysview/HostWS.cpp +++ b/src/sysview/HostWS.cpp @@ -188,7 +188,10 @@ int HostWS::run() if (peerStatusUpdate.isRunning() && peerStatusUpdate.hasExpired()) { peerStatusUpdate.start(); + getNetwork()->lockPeerStatus(); std::map peerStatus(getNetwork()->peerStatus.begin(), getNetwork()->peerStatus.end()); + getNetwork()->unlockPeerStatus(); + for (auto entry : peerStatus) { json::object wsObj = json::object(); std::string type = "peer_status"; diff --git a/src/sysview/NodeStatusWnd.h b/src/sysview/NodeStatusWnd.h index e57138b0..c2e9a16b 100644 --- a/src/sysview/NodeStatusWnd.h +++ b/src/sysview/NodeStatusWnd.h @@ -452,7 +452,10 @@ public: void update() { const auto& rootWidget = getRootWidget(); + getNetwork()->lockPeerStatus(); std::map peerStatus(getNetwork()->peerStatus.begin(), getNetwork()->peerStatus.end()); + getNetwork()->unlockPeerStatus(); + for (auto entry : peerStatus) { uint32_t peerId = entry.first; json::object peerObj = entry.second; diff --git a/src/sysview/network/PeerNetwork.cpp b/src/sysview/network/PeerNetwork.cpp index 94567fb4..ddc7fdf1 100644 --- a/src/sysview/network/PeerNetwork.cpp +++ b/src/sysview/network/PeerNetwork.cpp @@ -19,6 +19,12 @@ using namespace network; #include +// --------------------------------------------------------------------------- +// Static Class Members +// --------------------------------------------------------------------------- + +std::mutex PeerNetwork::m_peerStatusMutex; + // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- @@ -89,6 +95,7 @@ void PeerNetwork::userPacketHandler(uint32_t peerId, FrameQueue::OpcodePair opco } json::object obj = v.get(); + std::lock_guard lock(m_peerStatusMutex); peerStatus[peerId] = obj; } break; diff --git a/src/sysview/network/PeerNetwork.h b/src/sysview/network/PeerNetwork.h index 8620b19a..1321fcce 100644 --- a/src/sysview/network/PeerNetwork.h +++ b/src/sysview/network/PeerNetwork.h @@ -25,6 +25,7 @@ #include #include +#include namespace network { @@ -56,6 +57,15 @@ namespace network PeerNetwork(const std::string& address, uint16_t port, uint16_t localPort, uint32_t peerId, const std::string& password, bool duplex, bool debug, bool dmr, bool p25, bool nxdn, bool slot1, bool slot2, bool allowActivityTransfer, bool allowDiagnosticTransfer, bool updateLookup, bool saveLookup); + /** + * @brief Helper to lock the peer status mutex. + */ + void lockPeerStatus() { m_peerStatusMutex.lock(); } + /** + * @brief Helper to unlock the peer status mutex. + */ + void unlockPeerStatus() { m_peerStatusMutex.unlock(); } + /** * @brief Map of peer status. */ @@ -78,6 +88,9 @@ namespace network * @returns bool True, if configuration was sent, otherwise false. */ bool writeConfig() override; + + private: + static std::mutex m_peerStatusMutex; }; } // namespace network