summaryrefslogtreecommitdiff
path: root/indra/llui
diff options
context:
space:
mode:
authorRichard Linden <none@none>2012-01-03 09:41:16 -0800
committerRichard Linden <none@none>2012-01-03 09:41:16 -0800
commit3861249a749c99c2a7b05d15ef82f8ff21453d05 (patch)
treedcc087fe66d15634fde03e7a4bfaf5b8c7c0dab6 /indra/llui
parent0c0ff35d19969cc762dce510a4d5ee4649d96a24 (diff)
use lazy deletion of views via die() method to avoid some potential crashes
Diffstat (limited to 'indra/llui')
-rw-r--r--indra/llui/llmenugl.cpp7
-rw-r--r--indra/llui/llview.cpp6
2 files changed, 12 insertions, 1 deletions
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index cb237fca7c..95ecbb1c94 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -947,9 +947,14 @@ LLMenuItemBranchGL::LLMenuItemBranchGL(const LLMenuItemBranchGL::Params& p)
LLMenuItemBranchGL::~LLMenuItemBranchGL()
{
- delete mBranchHandle.get();
+ if (mBranchHandle.get())
+ {
+ mBranchHandle.get()->die();
+ }
}
+
+
// virtual
LLView* LLMenuItemBranchGL::getChildView(const std::string& name, BOOL recurse) const
{
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 486babb0ab..1529381773 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -121,6 +121,7 @@ LLView::Params::Params()
LLView::LLView(const LLView::Params& p)
: mVisible(p.visible),
+ mInDraw(false),
mName(p.name),
mParentView(NULL),
mReshapeFlags(FOLLOWS_NONE),
@@ -281,6 +282,8 @@ void LLView::moveChildToBackOfTabGroup(LLUICtrl* child)
// virtual
bool LLView::addChild(LLView* child, S32 tab_group)
{
+ llassert_always(mInDraw == false);
+
if (!child)
{
return false;
@@ -330,6 +333,7 @@ bool LLView::addChildInBack(LLView* child, S32 tab_group)
// remove the specified child from the view, and set it's parent to NULL.
void LLView::removeChild(LLView* child)
{
+ llassert_always(mInDraw == false);
//llassert_always(sDepth == 0); // Avoid re-ordering while drawing; it can cause subtle iterator bugs
if (child->mParentView == this)
{
@@ -1081,6 +1085,7 @@ void LLView::draw()
void LLView::drawChildren()
{
+ mInDraw = true;
if (!mChildList.empty())
{
LLView* rootp = LLUI::getRootView();
@@ -1119,6 +1124,7 @@ void LLView::drawChildren()
}
--sDepth;
}
+ mInDraw = false;
}
void LLView::dirtyRect()