diff --git a/indra/newview/fsareasearch.cpp b/indra/newview/fsareasearch.cpp index c825ec28dc..c9017f0b7e 100644 --- a/indra/newview/fsareasearch.cpp +++ b/indra/newview/fsareasearch.cpp @@ -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)) { diff --git a/indra/newview/fsareasearch.h b/indra/newview/fsareasearch.h index 11ff688a68..ed2c9af136 100644 --- a/indra/newview/fsareasearch.h +++ b/indra/newview/fsareasearch.h @@ -210,6 +210,9 @@ private: uuid_vec_t mNamesRequested; + typedef std::map name_cache_connection_map_t; + name_cache_connection_map_t mNameCacheConnections; + LLViewerRegion* mLastRegion; class FSParcelChangeObserver;