From 3b395a99cfd259675f90cbbdadf6065a31f50c96 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Fri, 17 Jan 2025 09:03:14 -0500 Subject: [PATCH] fix issue with potentional concurrency crash when updating lookup tables in PEER_LINK; --- src/common/Thread.cpp | 2 ++ src/common/lookups/LookupTable.h | 6 ++++++ src/common/lookups/TalkgroupRulesLookup.h | 6 ++++++ src/fne/network/PeerNetwork.cpp | 3 +++ 4 files changed, 17 insertions(+) diff --git a/src/common/Thread.cpp b/src/common/Thread.cpp index 49fc0ad4..93e9cc96 100644 --- a/src/common/Thread.cpp +++ b/src/common/Thread.cpp @@ -63,6 +63,8 @@ bool Thread::run() void Thread::wait() { + if (!m_started) + return; #if defined(_WIN32) ::WaitForSingleObject(m_thread, INFINITE); ::CloseHandle(m_thread); diff --git a/src/common/lookups/LookupTable.h b/src/common/lookups/LookupTable.h index 361f6e40..6eabc41c 100644 --- a/src/common/lookups/LookupTable.h +++ b/src/common/lookups/LookupTable.h @@ -178,6 +178,12 @@ namespace lookups */ void filename(std::string filename) { m_filename = filename; }; + /** + * @brief Helper to set the reload time of this lookup table. + * @param reloadTime Lookup time in seconds. + */ + void setReloadTime(uint32_t reloadTime) { m_reloadTime = 0U; } + protected: std::string m_filename; uint32_t m_reloadTime; diff --git a/src/common/lookups/TalkgroupRulesLookup.h b/src/common/lookups/TalkgroupRulesLookup.h index 0ed25811..05bbb883 100644 --- a/src/common/lookups/TalkgroupRulesLookup.h +++ b/src/common/lookups/TalkgroupRulesLookup.h @@ -599,6 +599,12 @@ namespace lookups */ void filename(std::string filename) { m_rulesFile = filename; }; + /** + * @brief Helper to set the reload time of this lookup table. + * @param reloadTime Lookup time in seconds. + */ + void setReloadTime(uint32_t reloadTime) { m_reloadTime = 0U; } + private: std::string m_rulesFile; uint32_t m_reloadTime; diff --git a/src/fne/network/PeerNetwork.cpp b/src/fne/network/PeerNetwork.cpp index 0339105a..5054daf5 100644 --- a/src/fne/network/PeerNetwork.cpp +++ b/src/fne/network/PeerNetwork.cpp @@ -222,6 +222,7 @@ void PeerNetwork::userPacketHandler(uint32_t peerId, FrameQueue::OpcodePair opco file.close(); m_tidLookup->stop(true); + m_tidLookup->setReloadTime(0U); m_tidLookup->filename(filename); m_tidLookup->reload(); @@ -359,6 +360,7 @@ void PeerNetwork::userPacketHandler(uint32_t peerId, FrameQueue::OpcodePair opco file.close(); m_ridLookup->stop(true); + m_ridLookup->setReloadTime(0U); m_ridLookup->filename(filename); m_ridLookup->reload(); @@ -496,6 +498,7 @@ void PeerNetwork::userPacketHandler(uint32_t peerId, FrameQueue::OpcodePair opco file.close(); m_pidLookup->stop(true); + m_pidLookup->setReloadTime(0U); m_pidLookup->filename(filename); m_pidLookup->reload();