Skip to content
Snippets Groups Projects
Commit d2d19206 authored by Brad Payne (Vir Linden)'s avatar Brad Payne (Vir Linden)
Browse files

For EXT-4855: Crash on onWearableAssetFetch. Prevent late-arriving wearables...

For EXT-4855: Crash on onWearableAssetFetch.  Prevent late-arriving wearables from touching a deleted object.
parent 9b44d686
No related branches found
No related tags found
No related merge requests found
...@@ -321,7 +321,7 @@ class LLWearableHoldingPattern ...@@ -321,7 +321,7 @@ class LLWearableHoldingPattern
~LLWearableHoldingPattern(); ~LLWearableHoldingPattern();
bool pollCompletion(); bool pollCompletion();
bool isDone(); bool isFetchCompleted();
bool isTimedOut(); bool isTimedOut();
typedef std::list<LLFoundData> found_list_t; typedef std::list<LLFoundData> found_list_t;
...@@ -330,10 +330,12 @@ class LLWearableHoldingPattern ...@@ -330,10 +330,12 @@ class LLWearableHoldingPattern
LLInventoryModel::item_array_t mGestItems; LLInventoryModel::item_array_t mGestItems;
S32 mResolved; S32 mResolved;
LLTimer mWaitTime; LLTimer mWaitTime;
bool mFired;
}; };
LLWearableHoldingPattern::LLWearableHoldingPattern(): LLWearableHoldingPattern::LLWearableHoldingPattern():
mResolved(0) mResolved(0),
mFired(false)
{ {
} }
...@@ -341,31 +343,34 @@ LLWearableHoldingPattern::~LLWearableHoldingPattern() ...@@ -341,31 +343,34 @@ LLWearableHoldingPattern::~LLWearableHoldingPattern()
{ {
} }
bool LLWearableHoldingPattern::isDone() bool LLWearableHoldingPattern::isFetchCompleted()
{ {
if (mResolved >= (S32)mFoundList.size()) return (mResolved >= (S32)mFoundList.size()); // have everything we were waiting for?
return true; // have everything we were waiting for
else if (isTimedOut())
{
llwarns << "Exceeded max wait time, updating appearance based on what has arrived" << llendl;
return true;
}
return false;
} }
bool LLWearableHoldingPattern::isTimedOut() bool LLWearableHoldingPattern::isTimedOut()
{ {
static F32 max_wait_time = 15.0; // give up if wearable fetches haven't completed in max_wait_time seconds. static F32 max_wait_time = 20.0; // give up if wearable fetches haven't completed in max_wait_time seconds.
return mWaitTime.getElapsedTimeF32() > max_wait_time; return mWaitTime.getElapsedTimeF32() > max_wait_time;
} }
bool LLWearableHoldingPattern::pollCompletion() bool LLWearableHoldingPattern::pollCompletion()
{ {
bool done = isDone(); bool completed = isFetchCompleted();
llinfos << "polling, done status: " << done << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; bool timed_out = isTimedOut();
bool done = completed || timed_out;
llinfos << "polling, done status: " << completed << " timed out? " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl;
if (done) if (done)
{ {
mFired = true;
if (timed_out)
{
llwarns << "Exceeded max wait time for wearables, updating appearance based on what has arrived" << llendl;
}
// Activate all gestures in this folder // Activate all gestures in this folder
if (mGestItems.count() > 0) if (mGestItems.count() > 0)
{ {
...@@ -397,8 +402,12 @@ bool LLWearableHoldingPattern::pollCompletion() ...@@ -397,8 +402,12 @@ bool LLWearableHoldingPattern::pollCompletion()
LLAgentWearables::userUpdateAttachments(mObjItems); LLAgentWearables::userUpdateAttachments(mObjItems);
} }
if (completed)
{
// Only safe to delete if all wearable callbacks completed.
delete this; delete this;
} }
}
return done; return done;
} }
...@@ -432,6 +441,10 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items) ...@@ -432,6 +441,10 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
static void onWearableAssetFetch(LLWearable* wearable, void* data) static void onWearableAssetFetch(LLWearable* wearable, void* data)
{ {
LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
if (holder->mFired)
{
llwarns << "called after holder fired" << llendl;
}
if(wearable) if(wearable)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment