From d82333534c0cc2b303357bad68fe28aea5fdb950 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 24 Apr 2018 13:43:09 -0700 Subject: [PATCH] Ensure the tree lock is always taken before the simulation lock --- assignment-client/src/entities/EntityServer.cpp | 11 ++++++++--- libraries/entities/src/SimpleEntitySimulation.cpp | 7 ++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index e3aca52ee5..70fad03d67 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -380,10 +380,15 @@ void EntityServer::trackSend(const QUuid& dataID, quint64 dataLastEdited, const } void EntityServer::trackViewerGone(const QUuid& sessionID) { - QWriteLocker locker(&_viewerSendingStatsLock); - _viewerSendingStats.remove(sessionID); + { + QWriteLocker locker(&_viewerSendingStatsLock); + _viewerSendingStats.remove(sessionID); + } + if (_entitySimulation) { - _entitySimulation->clearOwnership(sessionID); + _tree->withReadLock([&] { + _entitySimulation->clearOwnership(sessionID); + }); } } diff --git a/libraries/entities/src/SimpleEntitySimulation.cpp b/libraries/entities/src/SimpleEntitySimulation.cpp index 301011928b..cf42e93821 100644 --- a/libraries/entities/src/SimpleEntitySimulation.cpp +++ b/libraries/entities/src/SimpleEntitySimulation.cpp @@ -38,11 +38,8 @@ void SimpleEntitySimulation::clearOwnership(const QUuid& ownerID) { entity->clearSimulationOwnership(); entity->markAsChangedOnServer(); if (auto element = entity->getElement()) { - auto tree = getEntityTree(); - tree->withReadLock([&] { - DirtyOctreeElementOperator op(element); - tree->recurseTreeWithOperator(&op); - }); + DirtyOctreeElementOperator op(element); + getEntityTree()->recurseTreeWithOperator(&op); } } else { ++itemItr;