From c06fcc005b3b47b69e76ed37907e74fe554109d5 Mon Sep 17 00:00:00 2001 From: dt <qtc-committer@nokia.com> Date: Thu, 11 Mar 2010 17:01:06 +0100 Subject: [PATCH] Fix crash for closing creator while evaluate is still in progress --- src/plugins/qt4projectmanager/profilereader.cpp | 2 -- src/plugins/qt4projectmanager/qt4nodes.cpp | 10 ++++++++-- src/plugins/qt4projectmanager/qt4project.cpp | 16 +++++++++------- src/plugins/qt4projectmanager/qt4project.h | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp index 30c7ad70ea7..3781fc37d05 100644 --- a/src/plugins/qt4projectmanager/profilereader.cpp +++ b/src/plugins/qt4projectmanager/profilereader.cpp @@ -110,8 +110,6 @@ ProFile *ProFileReader::proFileFor(const QString &name) return m_includeFiles.value(name); } - - ProFileCacheManager *ProFileCacheManager::s_instance = 0; ProFileCacheManager::ProFileCacheManager(QObject *parent) : diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 168517d292e..ad1c1fd501a 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -839,6 +839,11 @@ Qt4ProFileNode::~Qt4ProFileNode() delete it.value(); } m_parseFutureWatcher.waitForFinished(); + if (m_readerExact) { + // Oh we need to clean up + applyEvaluate(true, true); + m_project->decrementPendingEvaluateFutures(); + } } bool Qt4ProFileNode::isParent(Qt4ProFileNode *node) @@ -958,9 +963,10 @@ Qt4ProjectType proFileTemplateTypeToProjectType(ProFileEvaluator::TemplateType t void Qt4ProFileNode::applyEvaluate(bool parseResult, bool async) { + if (!m_readerExact) + return; if (!parseResult || m_project->wasEvaluateCanceled()) { - if (m_readerExact) - m_project->destroyProFileReader(m_readerExact); + m_project->destroyProFileReader(m_readerExact); if (m_readerCumulative) m_project->destroyProFileReader(m_readerCumulative); m_readerExact = m_readerCumulative = 0; diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index e13c2da0352..5b187c98657 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -248,8 +248,11 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) : Qt4Project::~Qt4Project() { + m_asyncUpdateState = ShuttingDown; m_manager->unregisterProject(this); delete m_projectFiles; + m_cancelEvaluate = true; + delete m_rootProjectNode; } void Qt4Project::updateFileList() @@ -729,17 +732,16 @@ void Qt4Project::decrementPendingEvaluateFutures() m_asyncUpdateFutureInterface = 0; m_cancelEvaluate = false; - // After beeing done, we need to call: - updateFileList(); - updateCodeModel(); - checkForNewApplicationProjects(); - checkForDeletedApplicationProjects(); - // TODO clear the profile cache ? if (m_asyncUpdateState == AsyncFullUpdatePending || m_asyncUpdateState == AsyncPartialUpdatePending) { qDebug()<<" Oh update is pending start the timer"; m_asyncUpdateTimer.start(); - } else { + } else if (m_asyncUpdateState != ShuttingDown){ + // After beeing done, we need to call: + updateFileList(); + updateCodeModel(); + checkForNewApplicationProjects(); + checkForDeletedApplicationProjects(); qDebug()<<" Setting state to Base"; m_asyncUpdateState = Base; } diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 7846370d3bc..18a24d3ecfd 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -229,7 +229,7 @@ private: QTimer m_asyncUpdateTimer; QFutureInterface<void> *m_asyncUpdateFutureInterface; int m_pendingEvaluateFuturesCount; - enum AsyncUpdateState { NoState, Base, AsyncFullUpdatePending, AsyncPartialUpdatePending, AsyncUpdateInProgress }; + enum AsyncUpdateState { NoState, Base, AsyncFullUpdatePending, AsyncPartialUpdatePending, AsyncUpdateInProgress, ShuttingDown }; AsyncUpdateState m_asyncUpdateState; bool m_cancelEvaluate; QList<Internal::Qt4ProFileNode *> m_partialEvaluate; -- GitLab