From 5711dc8fade48b31eacbbd0c8fbd2c36757a4168 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 1 Apr 2015 15:39:36 +0200 Subject: [PATCH] FIRE-11330: More changes to prevent names getting stuck if both name request via caps or legacy fail Previous version could lead to a situation where a name request fails both via caps or legacy, or it will return broken data, with both cases leading to a callback connection waiting in the callback map and not issuing new requests for the same name. With the change, we might request names multiple times again, but handle the callback only once (first one wins) and disconnect all others waiting, since callObservers() will make sure all interested parties get notified about the received name. --- indra/llui/llurlentry.cpp | 40 ++++++++++++++++++--------------------- indra/llui/llurlentry.h | 12 ++++++------ 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index d69729a7db..ef082deac2 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -410,7 +410,7 @@ std::string LLUrlEntrySeconlifeURL::getUrl(const std::string &string) const // secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about // x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about // -// FIRE-11330: Names in chat gets stuck as "Loading..." +// FIRE-11330: Names in chat get stuck as "Loading..." //LLUrlEntryAgent::LLUrlEntryAgent() : // mAvatarNameCacheConnection() LLUrlEntryAgent::LLUrlEntryAgent() @@ -445,17 +445,18 @@ void LLUrlEntryAgent::callObservers(const std::string &id, void LLUrlEntryAgent::onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name) { - // FIRE-11330: Names in chat gets stuck as "Loading..." + // FIRE-11330: Names in chat get stuck as "Loading..." //mAvatarNameCacheConnection.disconnect(); - avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(id); - if (it != mAvatarNameCacheConnections.end()) + std::pair range; + range = mAvatarNameCacheConnections.equal_range(id); + for (avatar_name_cache_connection_map_t::iterator it = range.first; it != range.second; ++it) { if (it->second.connected()) { it->second.disconnect(); } - mAvatarNameCacheConnections.erase(it); } + mAvatarNameCacheConnections.erase(range.first, range.second); // std::string label = av_name.getCompleteName(); @@ -543,17 +544,14 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa } else { - // FIRE-11330: Names in chat gets stuck as "Loading..." + // FIRE-11330: Names in chat get stuck as "Loading..." //if (mAvatarNameCacheConnection.connected()) //{ // mAvatarNameCacheConnection.disconnect(); //} //mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgent::onAvatarNameCache, this, _1, _2)); - avatar_name_cache_connection_map_t::iterator found = mAvatarNameCacheConnections.find(agent_id); - if (found == mAvatarNameCacheConnections.end()) - { - mAvatarNameCacheConnections[agent_id] = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgent::onAvatarNameCache, this, _1, _2)); - } + boost::signals2::connection connection = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgent::onAvatarNameCache, this, _1, _2)); + mAvatarNameCacheConnections.insert(std::pair(agent_id, connection)); // addObserver(agent_id_string, url, cb); return LLTrans::getString("AvatarNameWaiting"); @@ -615,7 +613,7 @@ std::string LLUrlEntryAgent::getIcon(const std::string &url) // secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username) // x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username) // -// FIRE-11330: Names in chat gets stuck as "Loading..." +// FIRE-11330: Names in chat get stuck as "Loading..." //LLUrlEntryAgentName::LLUrlEntryAgentName() : // mAvatarNameCacheConnection() LLUrlEntryAgentName::LLUrlEntryAgentName() @@ -625,17 +623,18 @@ LLUrlEntryAgentName::LLUrlEntryAgentName() void LLUrlEntryAgentName::onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name) { - // FIRE-11330: Names in chat gets stuck as "Loading..." + // FIRE-11330: Names in chat get stuck as "Loading..." //mAvatarNameCacheConnection.disconnect(); - avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(id); - if (it != mAvatarNameCacheConnections.end()) + std::pair range; + range = mAvatarNameCacheConnections.equal_range(id); + for (avatar_name_cache_connection_map_t::iterator it = range.first; it != range.second; ++it) { if (it->second.connected()) { it->second.disconnect(); } - mAvatarNameCacheConnections.erase(it); } + mAvatarNameCacheConnections.erase(range.first, range.second); // std::string label = getName(av_name); @@ -671,17 +670,14 @@ std::string LLUrlEntryAgentName::getLabel(const std::string &url, const LLUrlLab } else { - // FIRE-11330: Names in chat gets stuck as "Loading..." + // FIRE-11330: Names in chat get stuck as "Loading..." //if (mAvatarNameCacheConnection.connected()) //{ // mAvatarNameCacheConnection.disconnect(); //} //mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgentName::onAvatarNameCache, this, _1, _2)); - avatar_name_cache_connection_map_t::iterator found = mAvatarNameCacheConnections.find(agent_id); - if (found == mAvatarNameCacheConnections.end()) - { - mAvatarNameCacheConnections[agent_id] = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgentName::onAvatarNameCache, this, _1, _2)); - } + boost::signals2::connection connection = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgentName::onAvatarNameCache, this, _1, _2)); + mAvatarNameCacheConnections.insert(std::pair(agent_id, connection)); // addObserver(agent_id_string, url, cb); return LLTrans::getString("AvatarNameWaiting"); diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 86197e6563..c5fdd2af1a 100755 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -195,7 +195,7 @@ public: LLUrlEntryAgent(); ~LLUrlEntryAgent() { - // FIRE-11330: Names in chat gets stuck as "Loading..." + // FIRE-11330: Names in chat get stuck as "Loading..." //if (mAvatarNameCacheConnection.connected()) //{ // mAvatarNameCacheConnection.disconnect(); @@ -219,10 +219,10 @@ public: protected: /*virtual*/ void callObservers(const std::string &id, const std::string &label, const std::string& icon); private: - // FIRE-11330: Names in chat gets stuck as "Loading..." void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); + // FIRE-11330: Names in chat get stuck as "Loading..." //boost::signals2::connection mAvatarNameCacheConnection; - typedef std::map avatar_name_cache_connection_map_t; + typedef std::multimap avatar_name_cache_connection_map_t; avatar_name_cache_connection_map_t mAvatarNameCacheConnections; // }; @@ -238,7 +238,7 @@ public: LLUrlEntryAgentName(); ~LLUrlEntryAgentName() { - // FIRE-11330: Names in chat gets stuck as "Loading..." + // FIRE-11330: Names in chat get stuck as "Loading..." //if (mAvatarNameCacheConnection.connected()) //{ // mAvatarNameCacheConnection.disconnect(); @@ -259,10 +259,10 @@ protected: // override this to pull out relevant name fields virtual std::string getName(const LLAvatarName& avatar_name) = 0; private: - // FIRE-11330: Names in chat gets stuck as "Loading..." void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); + // FIRE-11330: Names in chat get stuck as "Loading..." //boost::signals2::connection mAvatarNameCacheConnection; - typedef std::map avatar_name_cache_connection_map_t; + typedef std::multimap avatar_name_cache_connection_map_t; avatar_name_cache_connection_map_t mAvatarNameCacheConnections; // };