From 022f9bd9a8b80481bb5ecfd651457fe6df3bae30 Mon Sep 17 00:00:00 2001 From: Vadim Savchuk Date: Mon, 20 Sep 2010 19:08:45 +0300 Subject: 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. --- indra/newview/llnearbychathandler.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'indra/newview/llnearbychathandler.cpp') 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(); -- cgit v1.2.3