avoid a deadlock when clearing avatar entities

This commit is contained in:
Seth Alves 2018-01-17 17:56:25 -08:00
parent 5ce768f402
commit 45406177e5

View file

@ -328,13 +328,15 @@ void Avatar::updateAvatarEntities() {
AvatarEntityIDs recentlyDettachedAvatarEntities = getAndClearRecentlyDetachedIDs(); AvatarEntityIDs recentlyDettachedAvatarEntities = getAndClearRecentlyDetachedIDs();
if (!recentlyDettachedAvatarEntities.empty()) { if (!recentlyDettachedAvatarEntities.empty()) {
// only lock this thread when absolutely necessary // only lock this thread when absolutely necessary
AvatarEntityMap avatarEntityData;
_avatarEntitiesLock.withReadLock([&] { _avatarEntitiesLock.withReadLock([&] {
foreach (auto entityID, recentlyDettachedAvatarEntities) { avatarEntityData = _avatarEntityData;
if (!_avatarEntityData.contains(entityID)) {
entityTree->deleteEntity(entityID, true, true);
}
}
}); });
foreach (auto entityID, recentlyDettachedAvatarEntities) {
if (!avatarEntityData.contains(entityID)) {
entityTree->deleteEntity(entityID, true, true);
}
}
// remove stale data hashes // remove stale data hashes
foreach (auto entityID, recentlyDettachedAvatarEntities) { foreach (auto entityID, recentlyDettachedAvatarEntities) {