summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Savchuk <vsavchuk@productengine.com>2010-09-20 19:08:45 +0300
committerVadim Savchuk <vsavchuk@productengine.com>2010-09-20 19:08:45 +0300
commit022f9bd9a8b80481bb5ecfd651457fe6df3bae30 (patch)
treed539533c63b47d2b2d5ecffa299070966c707c0f
parentb92ca367aed209b6e8007035ea307d5a0c8d53dc (diff)
STORM-192 ADDITIONAL FIX Fixed crash on pressing Ctrl+Shift+W (which closes all floaters).
The crash was introduced by my previous fix of this ticket in changeset 8ceebd3612f0. The problem was that, suprisingly, even invisible (faded) toasts were destroyed when you hit Ctrl_Shift+W, however they were still referenced by the toast pool, so the references were invalidated. The easiest fix would be to remove all references to the toast being destroyed, no matter is it visible or not. However, then we'd have to search for each destroyed toast in the pool, which is slow. Besides, removing toasts from the pool compromises the whole idea of pooling (which was introduced to speed up creation of new toasts). Another possible fix is not to destroy any nearby chat toasts when user hits Ctrl+Shift+W. That would save us from any crashes at a price of changing existing behaviour (the toasts will remain visible). So I went for a third option: when closing all floaters, skip invisible ones. Then there won't be attempts to destroy invisible (pooled) toasts, so the crash won't happen, and we don't seem to change any existing behavior. However I'm not 100% sure of the latter statement, so the fix requires extensive testing.
-rw-r--r--indra/llui/llfloater.cpp4
-rw-r--r--indra/newview/llnearbychathandler.cpp13
2 files changed, 15 insertions, 2 deletions
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index c0942cf3c7..eb5d7a6b6a 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2390,7 +2390,9 @@ void LLFloaterView::closeAllChildren(bool app_quitting)
// Attempt to close floater. This will cause the "do you want to save"
// dialogs to appear.
- if (floaterp->canClose() && !floaterp->isDead())
+ // Skip invisible floaters if we're not quitting (STORM-192).
+ if (floaterp->canClose() && !floaterp->isDead() &&
+ (app_quitting || floaterp->getVisible()))
{
floaterp->closeFloater(app_quitting);
}
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index b6d2e02eef..c80583cd0e 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -54,6 +54,7 @@ LLToastPanelBase* createToastPanel()
class LLNearbyChatScreenChannel: public LLScreenChannelBase
{
+ LOG_CLASS(LLNearbyChatScreenChannel);
public:
LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;};
@@ -90,6 +91,7 @@ public:
virtual void deleteAllChildren()
{
+ LL_DEBUGS("NearbyChat") << "Clearing toast pool" << llendl;
m_toast_pool.clear();
m_active_toasts.clear();
LLScreenChannelBase::deleteAllChildren();
@@ -99,6 +101,7 @@ protected:
void deactivateToast(LLToast* toast);
void addToToastPool(LLToast* toast)
{
+ LL_DEBUGS("NearbyChat") << "Pooling toast" << llendl;
toast->setVisible(FALSE);
toast->stopTimer();
toast->setIsHidden(true);
@@ -153,6 +156,7 @@ void LLNearbyChatScreenChannel::deactivateToast(LLToast* toast)
return;
}
+ LL_DEBUGS("NearbyChat") << "Deactivating toast" << llendl;
m_active_toasts.erase(pos);
}
@@ -163,6 +167,8 @@ void LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)
void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitting)
{
+ LL_DEBUGS("NearbyChat") << "Toast destroyed (app_quitting=" << app_quitting << ")" << llendl;
+
if (app_quitting)
{
// Viewer is quitting.
@@ -179,7 +185,9 @@ void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitti
}
void LLNearbyChatScreenChannel::onToastFade(LLToast* toast)
-{
+{
+ LL_DEBUGS("NearbyChat") << "Toast fading" << llendl;
+
//fade mean we put toast to toast pool
if(!toast)
return;
@@ -208,6 +216,7 @@ bool LLNearbyChatScreenChannel::createPoolToast()
toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1));
+ LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl;
m_toast_pool.push_back(toast);
return true;
}
@@ -245,6 +254,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
if(m_toast_pool.empty())
{
//"pool" is empty - create one more panel
+ LL_DEBUGS("NearbyChat") << "Empty pool" << llendl;
if(!createPoolToast())//created toast will go to pool. so next call will find it
return;
addNotification(notification);
@@ -264,6 +274,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
//take 1st element from pool, (re)initialize it, put it in active toasts
+ LL_DEBUGS("NearbyChat") << "Getting toast from pool" << llendl;
LLToast* toast = m_toast_pool.back();
m_toast_pool.pop_back();