diff --git a/src/sysview/SysViewMain.cpp b/src/sysview/SysViewMain.cpp index 1c2c649e..355b2985 100644 --- a/src/sysview/SysViewMain.cpp +++ b/src/sysview/SysViewMain.cpp @@ -310,6 +310,22 @@ void* threadNetworkPump(void* arg) if (g_network != nullptr) { g_network->clock(ms); + // clock peer status timers and remove expired entries from the peer status map + g_network->lockPeerStatus(); + for (auto it = g_network->peerStatusTimers.begin(); it != g_network->peerStatusTimers.end();) { + if (it->second.isRunning() && it->second.hasExpired()) { + uint32_t peerId = it->first; + it = g_network->peerStatusTimers.erase(it); + g_network->peerStatus.erase(peerId); + g_network->peerStatusTimers[peerId].stop(); + LogInfoEx(LOG_HOST, "peer status expired, peerId = %u", peerId); + } + else { + ++it; + } + } + g_network->unlockPeerStatus(); + hrc::hrc_t pktTime = hrc::now(); uint32_t length = 0U; diff --git a/src/sysview/network/PeerNetwork.cpp b/src/sysview/network/PeerNetwork.cpp index af9472ae..c2e6ac87 100644 --- a/src/sysview/network/PeerNetwork.cpp +++ b/src/sysview/network/PeerNetwork.cpp @@ -22,6 +22,12 @@ using namespace network; #include #include +// --------------------------------------------------------------------------- +// Constants +// --------------------------------------------------------------------------- + +const uint32_t PEER_STATUS_EXPIRY = 60000U; // 60 seconds + // --------------------------------------------------------------------------- // Static Class Members // --------------------------------------------------------------------------- @@ -38,6 +44,7 @@ PeerNetwork::PeerNetwork(const std::string& address, uint16_t port, uint16_t loc bool duplex, bool debug, bool allowActivityTransfer, bool allowDiagnosticTransfer, bool updateLookup, bool saveLookup) : Network(address, port, localPort, peerId, password, duplex, debug, true, true, true, true, true, true, allowActivityTransfer, allowDiagnosticTransfer, updateLookup, saveLookup), peerStatus(), + peerStatusTimers(), m_peerReplica(false), m_tgidPkt(true, "Peer Replication, TGID List"), m_ridPkt(true, "Peer Replication, RID List") @@ -107,6 +114,7 @@ void PeerNetwork::userPacketHandler(uint32_t peerId, FrameQueue::OpcodePair opco uint32_t actualPeerId = obj["peerId"].getDefault(peerId); std::lock_guard lock(s_peerStatusMutex); peerStatus[actualPeerId] = obj; + peerStatusTimers[actualPeerId].start(PEER_STATUS_EXPIRY); } break; diff --git a/src/sysview/network/PeerNetwork.h b/src/sysview/network/PeerNetwork.h index 8b5bef94..aa321fd9 100644 --- a/src/sysview/network/PeerNetwork.h +++ b/src/sysview/network/PeerNetwork.h @@ -74,6 +74,11 @@ namespace network * @brief Map of peer status. */ std::unordered_map peerStatus; + /** + * @brief Map of peer status timers, used to track when peer status entries should be expired and + * removed from the map. + */ + std::unordered_map peerStatusTimers; protected: /**