From 001eae784a60049fba372e3b4f7dd5c37a459233 Mon Sep 17 00:00:00 2001 From: Roxanne Skelly Date: Fri, 21 Jun 2019 11:42:27 -0700 Subject: [PATCH] Add locks to OctreeEditPacketSender to protect various members --- libraries/octree/src/OctreeEditPacketSender.cpp | 5 ++++- libraries/octree/src/OctreeEditPacketSender.h | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index d8d3041270..7b84205691 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -46,6 +46,7 @@ bool OctreeEditPacketSender::serversExist() const { void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::unique_ptr packet) { bool wantDebug = false; + QMutexLocker lock(&_packetsQueueLock); DependencyManager::get()->eachNode([&](const SharedNodePointer& node){ // only send to the NodeTypes that are getMyNodeType() if (node->getType() == getMyNodeType() @@ -324,6 +325,8 @@ bool OctreeEditPacketSender::process() { void OctreeEditPacketSender::processNackPacket(ReceivedMessage& message, SharedNodePointer sendingNode) { // parse sending node from packet, retrieve packet history for that node + QMutexLocker lock(&_packetsQueueLock); + // if packet history doesn't exist for the sender node (somehow), bail if (_sentPacketHistories.count(sendingNode->getUUID()) == 0) { return; @@ -345,7 +348,7 @@ void OctreeEditPacketSender::processNackPacket(ReceivedMessage& message, SharedN } void OctreeEditPacketSender::nodeKilled(SharedNodePointer node) { - // TODO: add locks + QMutexLocker lock(&_packetsQueueLock); QUuid nodeUUID = node->getUUID(); _pendingEditPackets.erase(nodeUUID); _outgoingSequenceNumbers.erase(nodeUUID); diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 1dad5b74c7..318f6b81bb 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -86,19 +86,20 @@ protected: void processPreServerExistsPackets(); // These are packets which are destined from know servers but haven't been released because they're still too small + // protected by _packetsQueueLock std::unordered_map _pendingEditPackets; // These are packets that are waiting to be processed because we don't yet know if there are servers int _maxPendingMessages; bool _releaseQueuedMessagesPending; QMutex _pendingPacketsLock; - QMutex _packetsQueueLock; // don't let different threads release the queue while another thread is writing to it + QMutex _packetsQueueLock{ QMutex::Recursive }; // don't let different threads release the queue while another thread is writing to it std::list _preServerEdits; // these will get packed into other larger packets std::list> _preServerSingleMessagePackets; // these will go out as is QMutex _releaseQueuedPacketMutex; - // TODO: add locks for this and _pendingEditPackets + // protected by _packetsQueueLock std::unordered_map _sentPacketHistories; std::unordered_map _outgoingSequenceNumbers; };