Depending on destrution order of static objects (compiler dependent), LLAvatarTracker could crash. This should fix it.

Nicky 2012-05-31 22:01:45 +02:00
parent d99d8c7fdc
commit 367117e8ee
2 changed files with 18 additions and 7 deletions

View File

@ -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;
// <FS:ND> FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
enum ETrackerState { eUndef = 0, eStarted, eDead };
ETrackerState sTrackerState;
// </FS:ND>
// 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;
}
// </FS:ND> FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
// <FS:ND> 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<LLUUID, std::set<LLFriendObserver*> > &aContainer, LLFriendObserver const *aObserver )
@ -1031,18 +1039,21 @@ void removeDanglingObserver( std::map<LLUUID, std::set<LLFriendObserver*> > &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 );
}
// </FS:ND>

View File

@ -226,7 +226,7 @@ public:
LLAvatarTracker();
~LLAvatarTracker();
void onObserverDied( LLFriendObserver const* ); // </FS:ND> FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
static void onObserverDied( LLFriendObserver const* ); // </FS:ND> FIRE-6077; FIRE-6227; FIRE-6431; SUP-9654
};
// collect set of LLUUIDs we're a proxy for