mirror of
https://github.com/overte-org/overte.git
synced 2025-07-30 00:30:22 +02:00
Merge pull request #7415 from howard-stearns/thread-safe-entityToElementMap
Possible fix for getContainingElement crash.
This commit is contained in:
commit
ed3a9cb24b
2 changed files with 10 additions and 5 deletions
|
@ -57,10 +57,13 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) {
|
||||||
if (_simulation) {
|
if (_simulation) {
|
||||||
_simulation->clearEntities();
|
_simulation->clearEntities();
|
||||||
}
|
}
|
||||||
foreach (EntityTreeElementPointer element, _entityToElementMap) {
|
{
|
||||||
|
QWriteLocker locker(&_entityToElementLock);
|
||||||
|
foreach(EntityTreeElementPointer element, _entityToElementMap) {
|
||||||
element->cleanupEntities();
|
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();
|
||||||
|
|
|
@ -293,6 +293,7 @@ protected:
|
||||||
|
|
||||||
EntityItemFBXService* _fbxService;
|
EntityItemFBXService* _fbxService;
|
||||||
|
|
||||||
|
mutable QReadWriteLock _entityToElementLock;
|
||||||
QHash<EntityItemID, EntityTreeElementPointer> _entityToElementMap;
|
QHash<EntityItemID, EntityTreeElementPointer> _entityToElementMap;
|
||||||
|
|
||||||
EntitySimulation* _simulation;
|
EntitySimulation* _simulation;
|
||||||
|
|
Loading…
Reference in a new issue