summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Teske <daniel.teske@nokia.com>2011-11-24 15:46:03 +0100
committerDaniel Teske <daniel.teske@nokia.com>2011-11-24 17:24:18 +0100
commit3dc96ba1a84df371626f43c06759a6cc26d3f9a7 (patch)
tree5d09cc558b3027f4e8c50cbc13d082c1283c06cf
parentcc11186bad9229c231f2fbba176645f3a3c20327 (diff)
downloadqt-creator-3dc96ba1a84df371626f43c06759a6cc26d3f9a7.tar.gz
Fix crash on closing a tab of a asynchronously closing runcontrol
Task-number: QTCREATORBUG-6579 Change-Id: Ia1d629df24e1a4c7f4f830f575d1be4adc552409 Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
-rw-r--r--src/plugins/projectexplorer/appoutputpane.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp
index e5caea75d1..33f9e6ccc6 100644
--- a/src/plugins/projectexplorer/appoutputpane.cpp
+++ b/src/plugins/projectexplorer/appoutputpane.cpp
@@ -427,7 +427,7 @@ bool AppOutputPane::closeTab(int index)
bool AppOutputPane::closeTab(int tabIndex, CloseTabMode closeTabMode)
{
- const int index = indexOf(m_tabWidget->widget(tabIndex));
+ int index = indexOf(m_tabWidget->widget(tabIndex));
QTC_ASSERT(index != -1, return true;)
RunControlTab &tab = m_runControlTabs[index];
@@ -441,13 +441,29 @@ bool AppOutputPane::closeTab(int tabIndex, CloseTabMode closeTabMode)
case CloseTabNoPrompt:
break;
case CloseTabWithPrompt:
+ QWidget *tabWidget = m_tabWidget->widget(tabIndex);
if (!tab.runControl->promptToStop())
return false;
+ // The event loop has run, thus the ordering might have changed, a tab might
+ // have been closed, so do some strange things...
+ tabIndex = m_tabWidget->indexOf(tabWidget);
+ index = indexOf(tabWidget);
+ if (tabIndex == -1 || index == -1)
+ return false;
+ tab = m_runControlTabs[index];
break;
}
- if (tab.runControl->stop() == RunControl::AsynchronousStop) {
- tab.asyncClosing = true;
- return false;
+ if (tab.runControl->isRunning()) { // yes it might have stopped already, then just close
+ QWidget *tabWidget = m_tabWidget->widget(tabIndex);
+ if (tab.runControl->stop() == RunControl::AsynchronousStop) {
+ tab.asyncClosing = true;
+ return false;
+ }
+ tabIndex = m_tabWidget->indexOf(tabWidget);
+ index = indexOf(tabWidget);
+ if (tabIndex == -1 || index == -1)
+ return false;
+ tab = m_runControlTabs[index];
}
}