diff options
author | Daniel Teske <daniel.teske@nokia.com> | 2011-11-24 15:46:03 +0100 |
---|---|---|
committer | Daniel Teske <daniel.teske@nokia.com> | 2011-11-24 17:24:18 +0100 |
commit | 3dc96ba1a84df371626f43c06759a6cc26d3f9a7 (patch) | |
tree | 5d09cc558b3027f4e8c50cbc13d082c1283c06cf /src | |
parent | cc11186bad9229c231f2fbba176645f3a3c20327 (diff) | |
download | qt-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>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/projectexplorer/appoutputpane.cpp | 24 |
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]; } } |