diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-05-26 09:06:06 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-05-27 07:56:35 +0000 |
commit | 03b73243252fbbf3ba7ae3831a45b96397ecc935 (patch) | |
tree | 3e6dd88b1ef7e7b3591c2dfdf63b5538a91f665a /src/plugins/cpptools/cppprojectupdater.cpp | |
parent | ff0ff1a3b52b8b4bb15b077a33e1e0d9b6af4ab4 (diff) | |
download | qt-creator-03b73243252fbbf3ba7ae3831a45b96397ecc935.tar.gz |
CppProjectUpdater: Wait for all tasks to be finished in d'tor
It may happen that the old task was canceled and still running
while the new task was started. Later, when the d'tor is called
both old and new tasks may still be running. Before we waited only
for the new task to be finished in d'tor. Now we are waiting
for all tasks to be finished.
Amends: 7fb592fe0cfec22ae7e966b9c6b88aa801bf9592
Task-number: QTCREATORBUG-25709
Change-Id: Id4b44cd36ee03aa45472b15d8fbb25a2cab77e92
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/plugins/cpptools/cppprojectupdater.cpp')
-rw-r--r-- | src/plugins/cpptools/cppprojectupdater.cpp | 26 |
1 files changed, 7 insertions, 19 deletions
diff --git a/src/plugins/cpptools/cppprojectupdater.cpp b/src/plugins/cpptools/cppprojectupdater.cpp index 567aabde5e..794fd7abe7 100644 --- a/src/plugins/cpptools/cppprojectupdater.cpp +++ b/src/plugins/cpptools/cppprojectupdater.cpp @@ -43,11 +43,7 @@ CppProjectUpdater::CppProjectUpdater() &QFutureWatcher<ProjectInfo>::finished, this, &CppProjectUpdater::onProjectInfoGenerated); -} - -CppProjectUpdater::~CppProjectUpdater() -{ - cancelAndWaitForFinished(); + m_futureSynchronizer.setCancelOnWait(true); } void CppProjectUpdater::update(const ProjectExplorer::ProjectUpdateInfo &projectUpdateInfo) @@ -63,30 +59,21 @@ void CppProjectUpdater::update(const ProjectExplorer::ProjectUpdateInfo &project this, &CppProjectUpdater::onToolChainRemoved); // Run the project info generator in a worker thread and continue if that one is finished. - m_generateFuture = Utils::runAsync([=](QFutureInterface<ProjectInfo> &futureInterface) { + auto generateFuture = Utils::runAsync([=](QFutureInterface<ProjectInfo> &futureInterface) { ProjectUpdateInfo fullProjectUpdateInfo = projectUpdateInfo; if (fullProjectUpdateInfo.rppGenerator) fullProjectUpdateInfo.rawProjectParts = fullProjectUpdateInfo.rppGenerator(); Internal::ProjectInfoGenerator generator(futureInterface, fullProjectUpdateInfo); futureInterface.reportResult(generator.generate()); }); - m_generateFutureWatcher.setFuture(m_generateFuture); + m_generateFutureWatcher.setFuture(generateFuture); + m_futureSynchronizer.addFuture(generateFuture); } void CppProjectUpdater::cancel() { m_generateFutureWatcher.setFuture({}); - m_generateFuture.cancel(); - m_updateFuture.cancel(); -} - -void CppProjectUpdater::cancelAndWaitForFinished() -{ - cancel(); - if (m_generateFuture.isRunning()) - m_generateFuture.waitForFinished(); - if (m_updateFuture.isRunning()) - m_updateFuture.waitForFinished(); + m_futureSynchronizer.cancelAllFutures(); } void CppProjectUpdater::onToolChainRemoved(ProjectExplorer::ToolChain *t) @@ -106,8 +93,9 @@ void CppProjectUpdater::onProjectInfoGenerated() if (m_generateFutureWatcher.isCanceled() || m_generateFutureWatcher.future().resultCount() < 1) return; - m_updateFuture = CppModelManager::instance()->updateProjectInfo( + auto updateFuture = CppModelManager::instance()->updateProjectInfo( m_generateFutureWatcher.result()); + m_futureSynchronizer.addFuture(updateFuture); } CppProjectUpdaterFactory::CppProjectUpdaterFactory() |