From 88585592470af655c96b06585b266e1e91c3fe1f Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Mon, 21 Mar 2016 14:02:18 -0700 Subject: [PATCH] Make access to entityToElementMap thread safe. --- libraries/entities/src/EntityTree.cpp | 14 +++++++++----- libraries/entities/src/EntityTree.h | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 3b68725b06..af1c2e71aa 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -57,10 +57,13 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) { if (_simulation) { _simulation->clearEntities(); } - foreach (EntityTreeElementPointer element, _entityToElementMap) { - element->cleanupEntities(); + { + QWriteLocker locker(&_entityToElementLock); + foreach(EntityTreeElementPointer element, _entityToElementMap) { + element->cleanupEntities(); + } + _entityToElementMap.clear(); } - _entityToElementMap.clear(); Octree::eraseAllOctreeElements(createNewRoot); resetClientEditStats(); @@ -1229,13 +1232,13 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons } EntityTreeElementPointer EntityTree::getContainingElement(const EntityItemID& entityItemID) /*const*/ { - // TODO: do we need to make this thread safe? Or is it acceptable as is + QReadLocker locker(&_entityToElementLock); EntityTreeElementPointer element = _entityToElementMap.value(entityItemID); return element; } void EntityTree::setContainingElement(const EntityItemID& entityItemID, EntityTreeElementPointer element) { - // TODO: do we need to make this thread safe? Or is it acceptable as is + QWriteLocker locker(&_entityToElementLock); if (element) { _entityToElementMap[entityItemID] = element; } else { @@ -1245,6 +1248,7 @@ void EntityTree::setContainingElement(const EntityItemID& entityItemID, EntityTr void EntityTree::debugDumpMap() { qCDebug(entities) << "EntityTree::debugDumpMap() --------------------------"; + QReadLocker locker(&_entityToElementLock); QHashIterator i(_entityToElementMap); while (i.hasNext()) { i.next(); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 1c5a696b17..e6507e66a4 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -290,6 +290,7 @@ protected: EntityItemFBXService* _fbxService; + mutable QReadWriteLock _entityToElementLock; QHash _entityToElementMap; EntitySimulation* _simulation;