Properly disconnect name cache callbacks in area search

master
Ansariel 2021-04-12 20:18:19 +02:00
parent 93d9e680eb
commit 65cb6880c3
2 changed files with 27 additions and 3 deletions

View File

@ -193,6 +193,15 @@ FSAreaSearch::~FSAreaSearch()
mRlvBehaviorCallbackConnection.disconnect();
}
for (const auto& cb : mNameCacheConnections)
{
if (cb.second.connected())
{
cb.second.disconnect();
}
}
mNameCacheConnections.clear();
if (mParcelChangedObserver)
{
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver);
@ -1138,7 +1147,8 @@ void FSAreaSearch::getNameFromUUID(const LLUUID& id, bool needs_rlva_check, std:
if (std::find(mNamesRequested.begin(), mNamesRequested.end(), id) == mNamesRequested.end())
{
mNamesRequested.push_back(id);
gCacheName->get(id, group, boost::bind(&FSAreaSearch::callbackLoadFullName, this, _1, _2));
boost::signals2::connection cb_connection = gCacheName->get(id, group, boost::bind(&FSAreaSearch::callbackLoadFullName, this, _1, _2));
mNameCacheConnections.insert(std::make_pair(id, cb_connection)); // mNamesRequested will do the dupe check
}
name_requested = true;
}
@ -1163,7 +1173,8 @@ void FSAreaSearch::getNameFromUUID(const LLUUID& id, bool needs_rlva_check, std:
if (std::find(mNamesRequested.begin(), mNamesRequested.end(), id) == mNamesRequested.end())
{
mNamesRequested.push_back(id);
LLAvatarNameCache::get(id, boost::bind(&FSAreaSearch::avatarNameCacheCallback, this, _1, _2, needs_rlva_check));
boost::signals2::connection cb_connection = LLAvatarNameCache::get(id, boost::bind(&FSAreaSearch::avatarNameCacheCallback, this, _1, _2, needs_rlva_check));
mNameCacheConnections.insert(std::make_pair(id, cb_connection)); // mNamesRequested will do the dupe check
}
name_requested = true;
}
@ -1186,13 +1197,23 @@ void FSAreaSearch::avatarNameCacheCallback(const LLUUID& id, const LLAvatarName&
void FSAreaSearch::callbackLoadFullName(const LLUUID& id, const std::string& full_name)
{
auto iter = mNameCacheConnections.find(id);
if (iter != mNameCacheConnections.end())
{
if (iter->second.connected())
{
iter->second.disconnect();
}
mNameCacheConnections.erase(iter);
}
LLViewerRegion* our_region = gAgent.getRegion();
for (auto& entry : mObjectDetails)
{
if (entry.second.name_requested && !entry.second.listed)
{
LLUUID object_id = entry.second.id;
const LLUUID& object_id = entry.second.id;
LLViewerObject* objectp = gObjectList.findObject(object_id);
if (objectp && isSearchableObject(objectp, our_region))
{

View File

@ -210,6 +210,9 @@ private:
uuid_vec_t mNamesRequested;
typedef std::map<LLUUID, boost::signals2::connection> name_cache_connection_map_t;
name_cache_connection_map_t mNameCacheConnections;
LLViewerRegion* mLastRegion;
class FSParcelChangeObserver;