From 21d760a533027610c8717c626a3052c7177b770d Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 17 Jul 2017 22:11:05 +0100 Subject: [PATCH] make sure to lock data --- libraries/avatars/src/AvatarData.cpp | 6 ++++++ libraries/avatars/src/AvatarData.h | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 5e63619c41..6fdb4d1ef6 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2366,6 +2366,12 @@ AvatarEntityMap AvatarData::getAvatarEntityData() const { return result; } +void AvatarData::insertDetachedEntityID(const QUuid entityID) { + _avatarEntitiesLock.withWriteLock([&] { + _avatarEntityDetached.insert(entityID); + }); +} + void AvatarData::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { if (avatarEntityData.size() > MAX_NUM_AVATAR_ENTITIES) { // the data is suspect diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 4a22d4e308..16768ec62a 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -615,7 +615,7 @@ public: Q_INVOKABLE AvatarEntityMap getAvatarEntityData() const; Q_INVOKABLE void setAvatarEntityData(const AvatarEntityMap& avatarEntityData); void setAvatarEntityDataChanged(bool value) { _avatarEntityDataChanged = value; } - void insertDetachedEntityID(const QUuid entityID) { _avatarEntityDetached.insert(entityID); } + void insertDetachedEntityID(const QUuid entityID); AvatarEntityIDs getAndClearRecentlyDetachedIDs(); // thread safe diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 193a0135c6..730677d85d 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -502,6 +502,8 @@ void EntityScriptingInterface::deleteEntity(QUuid id) { AvatarSharedPointer myAvatar = avatarHashMap->getAvatarBySessionID(myNodeID); if (entity->getClientOnly() && entity->getOwningAvatarID() != myNodeID) { // don't delete other avatar's avatarEntities + // If you actually own the entity but the onwership is not set because of a domain switch + // the line below make sure the entity is deleted. myAvatar->insertDetachedEntityID(id); shouldDelete = false; return;