From c3c34018fd2c3d21813924fc100342367cedfa08 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Fri, 8 May 2026 08:54:26 -0400 Subject: [PATCH] some minor code cleanups to handled unchecked thread locking; --- src/common/Thread.cpp | 2 +- src/fne/HostFNE.cpp | 4 ++-- src/fne/network/TrafficNetwork.cpp | 21 +++++++++++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/common/Thread.cpp b/src/common/Thread.cpp index 2873b55b..193400ca 100644 --- a/src/common/Thread.cpp +++ b/src/common/Thread.cpp @@ -41,7 +41,6 @@ bool Thread::run() if (m_started) return m_started; - m_started = true; #if defined(_WIN32) m_thread = ::CreateThread(NULL, 0, &helper, this, 0, NULL); if (m_thread == NULL) { @@ -55,6 +54,7 @@ bool Thread::run() return false; } #endif // defined(_WIN32) + m_started = true; return true; } diff --git a/src/fne/HostFNE.cpp b/src/fne/HostFNE.cpp index 27cc2f8d..2544de01 100644 --- a/src/fne/HostFNE.cpp +++ b/src/fne/HostFNE.cpp @@ -907,8 +907,8 @@ bool HostFNE::createPeerNetworks() if (enabled) { bool ret = network->open(); if (!ret) { - delete m_network; - m_network = nullptr; + delete network; + network = nullptr; LogError(LOG_HOST, "failed to initialize traffic networking for PEER %u", id); } } diff --git a/src/fne/network/TrafficNetwork.cpp b/src/fne/network/TrafficNetwork.cpp index ddd617db..176a80ae 100644 --- a/src/fne/network/TrafficNetwork.cpp +++ b/src/fne/network/TrafficNetwork.cpp @@ -545,13 +545,15 @@ void TrafficNetwork::clock(uint32_t ms) if (connection != nullptr && connection->jitterBufferEnabled()) { connection->checkJitterTimeouts(); } - } - m_peers.unlock(); - if (m_forceListUpdate) { - for (auto& peer : m_peers) { + if (m_forceListUpdate && connection != nullptr) { peerMetadataUpdate(peer.first); } + } + m_peers.shared_unlock(); + + // reset force flag + if (m_forceListUpdate) { m_forceListUpdate = false; } @@ -2454,13 +2456,16 @@ void TrafficNetwork::setPeerReplica(bool replica) std::string TrafficNetwork::resolvePeerIdentity(uint32_t peerId) { + m_peers.shared_lock(); auto it = std::find_if(m_peers.begin(), m_peers.end(), [&](PeerMapPair x) { return x.first == peerId; }); if (it != m_peers.end()) { if (it->second != nullptr) { FNEPeerConnection* peer = it->second; + m_peers.shared_unlock(); return peer->identWithQualifier(); } } + m_peers.shared_unlock(); return std::string(); } @@ -3266,6 +3271,7 @@ bool TrafficNetwork::writePeerQueue(udp::BufferQueue* buffers, uint32_t peerId, LogError(LOG_NET, "BUGBUG: PEER %u, trying to send data with a streamId of 0?", peerId); } + m_peers.shared_lock(); auto it = std::find_if(m_peers.begin(), m_peers.end(), [&](PeerMapPair x) { return x.first == peerId; }); if (it != m_peers.end()) { FNEPeerConnection* connection = m_peers.at(peerId); @@ -3296,14 +3302,17 @@ bool TrafficNetwork::writePeerQueue(udp::BufferQueue* buffers, uint32_t peerId, } } - if (buffers == nullptr) + if (buffers == nullptr) { + m_peers.shared_unlock(); return m_frameQueue->write(data, length, streamId, peerId, ssrc, opcode, pktSeq, addr, addrLen); - else { + } else { + m_peers.shared_unlock(); m_frameQueue->enqueueMessage(buffers, data, length, streamId, peerId, ssrc, opcode, pktSeq, addr, addrLen); return true; } } } + m_peers.shared_unlock(); return false; }