plug grab leak, more correct names

This commit is contained in:
Andrew Meadows 2019-01-24 14:57:54 -08:00
parent ee3fde9df1
commit 09fe9735fa
5 changed files with 32 additions and 15 deletions

View file

@ -452,6 +452,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar
_spaceProxiesToDelete.push_back(avatar->getSpaceIndex()); _spaceProxiesToDelete.push_back(avatar->getSpaceIndex());
} }
AvatarHashMap::handleRemovedAvatar(avatar, removalReason); AvatarHashMap::handleRemovedAvatar(avatar, removalReason);
avatar->tearDownGrabs();
avatar->die(); avatar->die();
queuePhysicsChange(avatar); queuePhysicsChange(avatar);

View file

@ -817,7 +817,7 @@ void MyAvatar::simulate(float deltaTime, bool inView) {
// and all of its joints, now update our attachements. // and all of its joints, now update our attachements.
Avatar::simulateAttachments(deltaTime); Avatar::simulateAttachments(deltaTime);
relayJointDataToChildren(); relayJointDataToChildren();
if (updateGrabs()) { if (applyGrabChanges()) {
_cauterizationNeedsUpdate = true; _cauterizationNeedsUpdate = true;
} }
@ -5310,7 +5310,7 @@ void MyAvatar::releaseGrab(const QUuid& grabID) {
_avatarGrabsLock.withWriteLock([&] { _avatarGrabsLock.withWriteLock([&] {
if (_avatarGrabData.remove(grabID)) { if (_avatarGrabData.remove(grabID)) {
_deletedAvatarGrabs.push_back(grabID); _grabsToDelete.push_back(grabID);
tellHandler = true; tellHandler = true;
} }
}); });

View file

@ -225,7 +225,7 @@ void OtherAvatar::simulate(float deltaTime, bool inView) {
{ {
PROFILE_RANGE(simulation, "grabs"); PROFILE_RANGE(simulation, "grabs");
updateGrabs(); applyGrabChanges();
} }
updateFadingStatus(); updateFadingStatus();

View file

@ -324,8 +324,8 @@ void Avatar::removeAvatarEntitiesFromTree() {
} }
} }
bool Avatar::updateGrabs() { bool Avatar::applyGrabChanges() {
if (!_avatarGrabDataChanged && _changedAvatarGrabs.empty() && _deletedAvatarGrabs.empty()) { if (!_avatarGrabDataChanged && _grabsToChange.empty() && _grabsToDelete.empty()) {
// early exit for most common case: nothing to do // early exit for most common case: nothing to do
return false; return false;
} }
@ -340,11 +340,11 @@ bool Avatar::updateGrabs() {
GrabPointer grab = std::make_shared<Grab>(); GrabPointer grab = std::make_shared<Grab>();
grab->fromByteArray(_avatarGrabData.value(grabID)); grab->fromByteArray(_avatarGrabData.value(grabID));
_avatarGrabs[grabID] = grab; _avatarGrabs[grabID] = grab;
_changedAvatarGrabs.insert(grabID); _grabsToChange.insert(grabID);
} else { } else {
bool changed = itr->second->fromByteArray(_avatarGrabData.value(grabID)); bool changed = itr->second->fromByteArray(_avatarGrabData.value(grabID));
if (changed) { if (changed) {
_changedAvatarGrabs.insert(grabID); _grabsToChange.insert(grabID);
} }
} }
} }
@ -353,7 +353,7 @@ bool Avatar::updateGrabs() {
// delete _avatarGrabs // delete _avatarGrabs
VectorOfIDs undeleted; VectorOfIDs undeleted;
for (const auto& id : _deletedAvatarGrabs) { for (const auto& id : _grabsToDelete) {
MapOfGrabs::iterator itr = _avatarGrabs.find(id); MapOfGrabs::iterator itr = _avatarGrabs.find(id);
if (itr == _avatarGrabs.end()) { if (itr == _avatarGrabs.end()) {
continue; continue;
@ -370,11 +370,11 @@ bool Avatar::updateGrabs() {
undeleted.push_back(id); undeleted.push_back(id);
} }
} }
_deletedAvatarGrabs = std::move(undeleted); _grabsToDelete = std::move(undeleted);
// change _avatarGrabs and add Actions to target // change _avatarGrabs and add Actions to target
SetOfIDs unchanged; SetOfIDs unchanged;
for (const auto& id : _changedAvatarGrabs) { for (const auto& id : _grabsToChange) {
MapOfGrabs::iterator itr = _avatarGrabs.find(id); MapOfGrabs::iterator itr = _avatarGrabs.find(id);
if (itr == _avatarGrabs.end()) { if (itr == _avatarGrabs.end()) {
continue; continue;
@ -396,7 +396,7 @@ bool Avatar::updateGrabs() {
unchanged.insert(id); unchanged.insert(id);
} }
} }
_changedAvatarGrabs = std::move(unchanged); _grabsToChange = std::move(unchanged);
}); });
return grabAddedOrRemoved; return grabAddedOrRemoved;
} }
@ -423,6 +423,20 @@ void Avatar::accumulateGrabPositions(std::map<QUuid, GrabLocationAccumulator>& g
}); });
} }
void Avatar::tearDownGrabs() {
_avatarGrabsLock.withWriteLock([&] {
for (const auto& entry : _avatarGrabs) {
_grabsToDelete.push_back(entry.first);
}
_grabsToChange.clear();
});
applyGrabChanges();
if (!_grabsToDelete.empty()) {
// some grabs failed to delete, which is a possible "leak", so we log about it
qWarning() << "Failed to tearDown" << _grabsToDelete.size() << "grabs for Avatar" << getID();
}
}
void Avatar::relayJointDataToChildren() { void Avatar::relayJointDataToChildren() {
forEachChild([&](SpatiallyNestablePointer child) { forEachChild([&](SpatiallyNestablePointer child) {
if (child->getNestableType() == NestableType::Entity) { if (child->getNestableType() == NestableType::Entity) {
@ -1925,7 +1939,7 @@ void Avatar::clearAvatarGrabData(const QUuid& id) {
AvatarData::clearAvatarGrabData(id); AvatarData::clearAvatarGrabData(id);
_avatarGrabsLock.withWriteLock([&] { _avatarGrabsLock.withWriteLock([&] {
if (_avatarGrabs.find(id) == _avatarGrabs.end()) { if (_avatarGrabs.find(id) == _avatarGrabs.end()) {
_deletedAvatarGrabs.push_back(id); _grabsToDelete.push_back(id);
} }
}); });
} }

View file

@ -441,6 +441,8 @@ public:
void accumulateGrabPositions(std::map<QUuid, GrabLocationAccumulator>& grabAccumulators); void accumulateGrabPositions(std::map<QUuid, GrabLocationAccumulator>& grabAccumulators);
void tearDownGrabs();
signals: signals:
void targetScaleChanged(float targetScale); void targetScaleChanged(float targetScale);
@ -543,7 +545,7 @@ protected:
// protected methods... // protected methods...
bool isLookingAtMe(AvatarSharedPointer avatar) const; bool isLookingAtMe(AvatarSharedPointer avatar) const;
bool updateGrabs(); bool applyGrabChanges();
void relayJointDataToChildren(); void relayJointDataToChildren();
void fade(render::Transaction& transaction, render::Transition::Type type); void fade(render::Transaction& transaction, render::Transition::Type type);
@ -637,8 +639,8 @@ protected:
using MapOfGrabs = std::map<QUuid, GrabPointer>; using MapOfGrabs = std::map<QUuid, GrabPointer>;
MapOfGrabs _avatarGrabs; MapOfGrabs _avatarGrabs;
SetOfIDs _changedAvatarGrabs; // updated grab IDs -- changes needed to entities or physics SetOfIDs _grabsToChange; // updated grab IDs -- changes needed to entities or physics
VectorOfIDs _deletedAvatarGrabs; // deleted grab IDs -- changes needed to entities or physics VectorOfIDs _grabsToDelete; // deleted grab IDs -- changes needed to entities or physics
}; };
#endif // hifi_Avatar_h #endif // hifi_Avatar_h