Merge pull request #3740 from secondlife/geenz/friends-list-race-condition-fix
#3739 Friends list login race conditionmeow-7.2.2
commit
693e05ab85
|
|
@ -271,6 +271,22 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds)
|
||||||
<< "]" << LL_ENDL;
|
<< "]" << LL_ENDL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// It's possible that the buddy list getting propagated from the inventory may have happened after we actually got the buddy list.
|
||||||
|
// Any buddies that we got prior will reside in a special queue that we must process and update statuses accordingly with.
|
||||||
|
// Do that here.
|
||||||
|
// -Geenz 2025-03-12
|
||||||
|
while (!mBuddyStatusQueue.empty())
|
||||||
|
{
|
||||||
|
auto buddyStatus = mBuddyStatusQueue.front();
|
||||||
|
mBuddyStatusQueue.pop();
|
||||||
|
|
||||||
|
if (mBuddyInfo.find(buddyStatus.first) != mBuddyInfo.end())
|
||||||
|
{
|
||||||
|
setBuddyOnline(buddyStatus.first, buddyStatus.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// do not notify observers here - list can be large so let it be done on idle.
|
// do not notify observers here - list can be large so let it be done on idle.
|
||||||
|
|
||||||
return new_buddy_count;
|
return new_buddy_count;
|
||||||
|
|
@ -335,6 +351,8 @@ void LLAvatarTracker::setBuddyOnline(const LLUUID& id, bool is_online)
|
||||||
{
|
{
|
||||||
LL_WARNS() << "!! No buddy info found for " << id
|
LL_WARNS() << "!! No buddy info found for " << id
|
||||||
<< ", setting to " << (is_online ? "Online" : "Offline") << LL_ENDL;
|
<< ", setting to " << (is_online ? "Online" : "Offline") << LL_ENDL;
|
||||||
|
LL_WARNS() << "Did we receive a buddy status update before the buddy info?" << LL_ENDL;
|
||||||
|
mBuddyStatusQueue.push(std::make_pair(id, is_online));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -706,6 +724,8 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
|
||||||
{
|
{
|
||||||
LL_WARNS() << "Received online notification for unknown buddy: "
|
LL_WARNS() << "Received online notification for unknown buddy: "
|
||||||
<< agent_id << " is " << (online ? "ONLINE" : "OFFLINE") << LL_ENDL;
|
<< agent_id << " is " << (online ? "ONLINE" : "OFFLINE") << LL_ENDL;
|
||||||
|
LL_WARNS() << "Adding buddy to buddy queue." << LL_ENDL;
|
||||||
|
mBuddyStatusQueue.push(std::make_pair(agent_id, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tracking_id == agent_id)
|
if(tracking_id == agent_id)
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,7 @@ public:
|
||||||
// add or remove agents from buddy list. Each method takes a set
|
// add or remove agents from buddy list. Each method takes a set
|
||||||
// of buddies and returns how many were actually added or removed.
|
// of buddies and returns how many were actually added or removed.
|
||||||
typedef std::map<LLUUID, LLRelationship*> buddy_map_t;
|
typedef std::map<LLUUID, LLRelationship*> buddy_map_t;
|
||||||
|
typedef std::queue<std::pair<LLUUID, bool>> buddy_status_queue_t;
|
||||||
|
|
||||||
S32 addBuddyList(const buddy_map_t& buddies);
|
S32 addBuddyList(const buddy_map_t& buddies);
|
||||||
//S32 removeBuddyList(const buddy_list_t& exes);
|
//S32 removeBuddyList(const buddy_list_t& exes);
|
||||||
|
|
@ -194,6 +195,7 @@ protected:
|
||||||
//LLInventoryObserver* mInventoryObserver;
|
//LLInventoryObserver* mInventoryObserver;
|
||||||
|
|
||||||
buddy_map_t mBuddyInfo;
|
buddy_map_t mBuddyInfo;
|
||||||
|
buddy_status_queue_t mBuddyStatusQueue;
|
||||||
|
|
||||||
typedef std::set<LLUUID> changed_buddy_t;
|
typedef std::set<LLUUID> changed_buddy_t;
|
||||||
changed_buddy_t mChangedBuddyIDs;
|
changed_buddy_t mChangedBuddyIDs;
|
||||||
|
|
|
||||||
|
|
@ -1714,6 +1714,15 @@ bool idle_startup()
|
||||||
gAssetStorage->setUpstream(regionp->getHost());
|
gAssetStorage->setUpstream(regionp->getHost());
|
||||||
gCacheName->setUpstream(regionp->getHost());
|
gCacheName->setUpstream(regionp->getHost());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// It is entirely possible that we may get the friends list _before_ we have the callbacks registered to process that.
|
||||||
|
// This will lead to the friends list not being processed properly and online statuses not being updated appropriately at login.
|
||||||
|
// So, we need to make sure that we have the callbacks registered before we get the friends list.
|
||||||
|
// This appears to crop up on some systems somewhere between STATE_AGENT_SEND and STATE_INVENTORY_SEND. It's happened to me a few times now.
|
||||||
|
// -Geenz 2025-03-12
|
||||||
|
LL_INFOS() << " AvatarTracker" << LL_ENDL;
|
||||||
|
LLAvatarTracker::instance().registerCallbacks(gMessageSystem);
|
||||||
|
|
||||||
do_startup_frame();
|
do_startup_frame();
|
||||||
|
|
||||||
// Create login effect
|
// Create login effect
|
||||||
|
|
@ -2013,8 +2022,6 @@ bool idle_startup()
|
||||||
LLMessageSystem* msg = gMessageSystem;
|
LLMessageSystem* msg = gMessageSystem;
|
||||||
LL_INFOS() << " Inventory" << LL_ENDL;
|
LL_INFOS() << " Inventory" << LL_ENDL;
|
||||||
LLInventoryModel::registerCallbacks(msg);
|
LLInventoryModel::registerCallbacks(msg);
|
||||||
LL_INFOS() << " AvatarTracker" << LL_ENDL;
|
|
||||||
LLAvatarTracker::instance().registerCallbacks(msg);
|
|
||||||
LL_INFOS() << " Landmark" << LL_ENDL;
|
LL_INFOS() << " Landmark" << LL_ENDL;
|
||||||
LLLandmark::registerCallbacks(msg);
|
LLLandmark::registerCallbacks(msg);
|
||||||
do_startup_frame();
|
do_startup_frame();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue