OpenSim crash fixes, thx to Henri and Zauber

This commit is contained in:
Siana Gearz
2011-03-15 15:19:37 +01:00
parent 0eab7bd2a5
commit 7b98e5f2f1
10 changed files with 58 additions and 10 deletions

View File

@@ -120,6 +120,10 @@ LLColor4 LLFolderViewItem::sSearchStatusColor;
LLUIImagePtr LLFolderViewItem::sArrowImage;
LLUIImagePtr LLFolderViewItem::sBoxImage;
// This is used to keep track of existing folder view items and
// avoid a crash bug due to a race condition (see in doIdle()).
static std::set<LLFolderViewItem*> sFolderViewItems;
//static
void LLFolderViewItem::initClass()
{
@@ -170,6 +174,7 @@ LLFolderViewItem::LLFolderViewItem( const std::string& name, LLUIImagePtr icon,
mDragAndDropTarget(FALSE),
mIsLoading(FALSE)
{
sFolderViewItems.insert(this);
refresh(); // possible opt: only call refreshFromListener()
setTabStop(FALSE);
}
@@ -177,6 +182,7 @@ LLFolderViewItem::LLFolderViewItem( const std::string& name, LLUIImagePtr icon,
// Destroys the object
LLFolderViewItem::~LLFolderViewItem( void )
{
sFolderViewItems.erase(this);
delete mListener;
mListener = NULL;
}
@@ -4401,7 +4407,19 @@ void LLFolderView::doIdle()
LLFastTimer t3(LLFastTimer::FTM_AUTO_SELECT);
// select new item only if a filtered item not currently selected
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
if ((!selected_itemp || !selected_itemp->getFiltered()) && !mAutoSelectOverride)
if (selected_itemp != NULL && sFolderViewItems.count(selected_itemp) == 0)
{
// There is a crash bug due to a race condition: when a folder view item is
// destroyed, its address may still appear in mSelectedItems a couple of doIdle()
// later, even if you explicitely clear this list and dirty the filters in the
// destructor...
// This code avoids the crash bug.
llwarns << "Invalid folder view item (" << selected_itemp << ") in selection: clearing the latter." << llendl;
dirtyFilter();
clearSelection();
requestArrange();
}
else if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->getFiltered()))
{
// select first filtered item
LLSelectFirstFilteredItem filter;