From 68fd9eafa8c3fd7409d410750be1cae162ec89b1 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 29 Jan 2018 10:23:24 -0800 Subject: [PATCH] fix entity parenting crash --- libraries/entities/src/EntityTree.cpp | 15 +++++++++++++-- libraries/entities/src/EntityTree.h | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 15fc3256bd..91694c86aa 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1678,14 +1678,23 @@ void EntityTree::entityChanged(EntityItemPointer entity) { } } +QVector EntityTree::getEntitiesParentFixup() const { + QReadLocker locker(&_needsParentFixupLock); + return _needsParentFixup; +} + +void EntityTree::setNeedsParentFixup(QVector entitiesFixup) { + QWriteLocker locker(&_needsParentFixupLock); + _needsParentFixup = entitiesFixup; +} void EntityTree::fixupNeedsParentFixups() { PROFILE_RANGE(simulation_physics, "FixupParents"); MovingEntitiesOperator moveOperator; - QWriteLocker locker(&_needsParentFixupLock); + QVector entitiesParentFixup = getEntitiesParentFixup(); - QMutableVectorIterator iter(_needsParentFixup); + QMutableVectorIterator iter(entitiesParentFixup); while (iter.hasNext()) { EntityItemWeakPointer entityWP = iter.next(); EntityItemPointer entity = entityWP.lock(); @@ -1748,6 +1757,8 @@ void EntityTree::fixupNeedsParentFixups() { PerformanceTimer perfTimer("recurseTreeWithOperator"); recurseTreeWithOperator(&moveOperator); } + + setNeedsParentFixup(entitiesParentFixup); } void EntityTree::deleteDescendantsOfAvatar(QUuid avatarID) { diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 11a747d624..fa44fd37b8 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -385,6 +385,8 @@ private: void sendChallengeOwnershipPacket(const QString& certID, const QString& ownerKey, const EntityItemID& entityItemID, const SharedNodePointer& senderNode); void sendChallengeOwnershipRequestPacket(const QByteArray& certID, const QByteArray& text, const QByteArray& nodeToChallenge, const SharedNodePointer& senderNode); void validatePop(const QString& certID, const EntityItemID& entityItemID, const SharedNodePointer& senderNode, bool isRetryingValidation); + QVector getEntitiesParentFixup() const; + void setNeedsParentFixup(QVector entitiesFixup); std::shared_ptr _myAvatar{ nullptr }; };