diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 4e8be972ea..fa9b6032b2 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -959,6 +959,9 @@ void EntityTree::fixupMissingParents() { iter.remove(); entity->markAncestorMissing(false); } + } else { + // entity was deleted before we found its parent. + iter.remove(); } } diff --git a/libraries/physics/src/ObjectAction.cpp b/libraries/physics/src/ObjectAction.cpp index e8e1188dc9..17b565ba21 100644 --- a/libraries/physics/src/ObjectAction.cpp +++ b/libraries/physics/src/ObjectAction.cpp @@ -23,15 +23,15 @@ ObjectAction::~ObjectAction() { } void ObjectAction::updateAction(btCollisionWorld* collisionWorld, btScalar deltaTimeStep) { + bool ownerEntityExpired = false; quint64 expiresWhen = 0; - EntityItemPointer ownerEntity = nullptr; withReadLock([&]{ - ownerEntity = _ownerEntity.lock(); + ownerEntityExpired = _ownerEntity.expired(); expiresWhen = _expires; }); - if (!ownerEntity) { + if (ownerEntityExpired) { qDebug() << "warning -- action with no entity removing self from btCollisionWorld."; btDynamicsWorld* dynamicsWorld = static_cast(collisionWorld); if (dynamicsWorld) { @@ -43,8 +43,10 @@ void ObjectAction::updateAction(btCollisionWorld* collisionWorld, btScalar delta if (expiresWhen > 0) { quint64 now = usecTimestampNow(); if (now > expiresWhen) { + EntityItemPointer ownerEntity = nullptr; QUuid myID; withWriteLock([&]{ + ownerEntity = _ownerEntity.lock(); _active = false; myID = getID(); });