diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 70dfc68a4c..8c2cf24b81 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -97,6 +97,12 @@ const F32 COARSE_FREQUENCY = 2.2f;
const F32 FIND_FREQUENCY = 29.7f; // This results in a database query, so cut these back
const F32 OFFLINE_SECONDS = FIND_FREQUENCY + 8.0f;
+
+// FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
+enum ETrackerState { eUndef = 0, eStarted, eDead };
+ETrackerState sTrackerState;
+//
+
// static
LLAvatarTracker LLAvatarTracker::sInstance;
@@ -116,10 +122,12 @@ LLAvatarTracker::LLAvatarTracker() :
//mInventoryObserver(NULL),
mModifyMask(0x0)
{
+ sTrackerState = eStarted;
}
LLAvatarTracker::~LLAvatarTracker()
{
+ sTrackerState = eDead;
deleteTrackingData();
std::for_each(mObservers.begin(), mObservers.end(), DeletePointer());
std::for_each(mBuddyInfo.begin(), mBuddyInfo.end(), DeletePairedPointer());
@@ -1004,12 +1012,12 @@ bool LLCollectAllBuddies::operator()(const LLUUID& buddy_id, LLRelationship* bud
return true;
}
-// FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
+// FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
// Make sure an observer gets removed once it dies.
LLFriendObserver::~LLFriendObserver()
{
- LLAvatarTracker::instance().onObserverDied( this );
+ LLAvatarTracker::onObserverDied( this );
}
void removeDanglingObserver( std::map > &aContainer, LLFriendObserver const *aObserver )
@@ -1031,18 +1039,21 @@ void removeDanglingObserver( std::map > &aCo
void LLAvatarTracker::onObserverDied( LLFriendObserver const *aObserver )
{
- for( observer_list_t::iterator itr = mObservers.begin(); itr != mObservers.end(); ++itr )
+ if( eDead == sTrackerState )
+ return;
+
+ for( observer_list_t::iterator itr = sInstance.mObservers.begin(); itr != sInstance.mObservers.end(); ++itr )
{
if( *itr == aObserver )
{
llwarns << "Removing dangling observer" << llendl;
- mObservers.erase( itr );
+ sInstance.mObservers.erase( itr );
break;
}
}
- removeDanglingObserver( mParticularFriendObserverMap, aObserver );
- removeDanglingObserver( mFriendPermissionObserverMap, aObserver );
+ removeDanglingObserver( sInstance.mParticularFriendObserverMap, aObserver );
+ removeDanglingObserver( sInstance.mFriendPermissionObserverMap, aObserver );
}
//
diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h
index b6a9dba97d..62cce87ec2 100644
--- a/indra/newview/llcallingcard.h
+++ b/indra/newview/llcallingcard.h
@@ -226,7 +226,7 @@ public:
LLAvatarTracker();
~LLAvatarTracker();
- void onObserverDied( LLFriendObserver const* ); // FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
+ static void onObserverDied( LLFriendObserver const* ); // FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
};
// collect set of LLUUIDs we're a proxy for