From 54f3232f63d835ef0c17aa195a64c0b248afc759 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 5 Mar 2021 15:14:51 +0100 Subject: [PATCH] Fix a crash inside ModelManagerInterface on Creator shutdown Synchronize all the running futures on shutdown. It's enough that all threads started by runAsync() just finish, without the need for delivering the results of these futures to onFinished handlers. Fixes: QTCREATORBUG-25350 Change-Id: Iac5ae3834bb02ef0a77b063c59097471ec7e757d Reviewed-by: Fawzi Mohamed --- src/libs/qmljs/qmljsmodelmanagerinterface.cpp | 4 +++- src/libs/qmljs/qmljsmodelmanagerinterface.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp index e89b8ae23c8..dc9435787f5 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp @@ -140,6 +140,7 @@ ModelManagerInterface::ModelManagerInterface(QObject *parent) ModelManagerInterface::~ModelManagerInterface() { + joinAllThreads(true); m_cppQmlTypesUpdater.cancel(); m_cppQmlTypesUpdater.waitForFinished(); Q_ASSERT(g_instance == this); @@ -1558,7 +1559,7 @@ void ModelManagerInterface::setDefaultVContext(const ViewerContext &vContext) m_defaultVContexts[vContext.language] = vContext; } -void ModelManagerInterface::joinAllThreads() +void ModelManagerInterface::joinAllThreads(bool cancelOnWait) { while (true) { FutureSynchronizer futureSynchronizer; @@ -1567,6 +1568,7 @@ void ModelManagerInterface::joinAllThreads() futureSynchronizer = m_futureSynchronizer; m_futureSynchronizer.clearFutures(); } + futureSynchronizer.setCancelOnWait(cancelOnWait); if (futureSynchronizer.isEmpty()) return; } diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h index e31c69b84e4..d4eb84e9585 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.h +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h @@ -244,7 +244,7 @@ protected: void setDefaultProject(const ProjectInfo &pInfo, ProjectExplorer::Project *p); private: - void joinAllThreads(); + void joinAllThreads(bool cancelOnWait = false); void iterateQrcFiles(ProjectExplorer::Project *project, QrcResourceSelector resources, const std::function &callback);