Merge pull request #7415 from howard-stearns/thread-safe-entityToElementMap

Possible fix for getContainingElement crash.
This commit is contained in:
Chris Collins 2016-03-21 15:30:04 -07:00
commit ed3a9cb24b
2 changed files with 10 additions and 5 deletions

View file

@ -57,10 +57,13 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) {
if (_simulation) { if (_simulation) {
_simulation->clearEntities(); _simulation->clearEntities();
} }
foreach (EntityTreeElementPointer element, _entityToElementMap) { {
element->cleanupEntities(); QWriteLocker locker(&_entityToElementLock);
foreach(EntityTreeElementPointer element, _entityToElementMap) {
element->cleanupEntities();
}
_entityToElementMap.clear();
} }
_entityToElementMap.clear();
Octree::eraseAllOctreeElements(createNewRoot); Octree::eraseAllOctreeElements(createNewRoot);
resetClientEditStats(); resetClientEditStats();
@ -1229,13 +1232,13 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons
} }
EntityTreeElementPointer EntityTree::getContainingElement(const EntityItemID& entityItemID) /*const*/ { 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); EntityTreeElementPointer element = _entityToElementMap.value(entityItemID);
return element; return element;
} }
void EntityTree::setContainingElement(const EntityItemID& entityItemID, EntityTreeElementPointer 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) { if (element) {
_entityToElementMap[entityItemID] = element; _entityToElementMap[entityItemID] = element;
} else { } else {
@ -1245,6 +1248,7 @@ void EntityTree::setContainingElement(const EntityItemID& entityItemID, EntityTr
void EntityTree::debugDumpMap() { void EntityTree::debugDumpMap() {
qCDebug(entities) << "EntityTree::debugDumpMap() --------------------------"; qCDebug(entities) << "EntityTree::debugDumpMap() --------------------------";
QReadLocker locker(&_entityToElementLock);
QHashIterator<EntityItemID, EntityTreeElementPointer> i(_entityToElementMap); QHashIterator<EntityItemID, EntityTreeElementPointer> i(_entityToElementMap);
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();

View file

@ -293,6 +293,7 @@ protected:
EntityItemFBXService* _fbxService; EntityItemFBXService* _fbxService;
mutable QReadWriteLock _entityToElementLock;
QHash<EntityItemID, EntityTreeElementPointer> _entityToElementMap; QHash<EntityItemID, EntityTreeElementPointer> _entityToElementMap;
EntitySimulation* _simulation; EntitySimulation* _simulation;