summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppprojectupdater.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2021-05-26 09:06:06 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2021-05-27 07:56:35 +0000
commit03b73243252fbbf3ba7ae3831a45b96397ecc935 (patch)
tree3e6dd88b1ef7e7b3591c2dfdf63b5538a91f665a /src/plugins/cpptools/cppprojectupdater.cpp
parentff0ff1a3b52b8b4bb15b077a33e1e0d9b6af4ab4 (diff)
downloadqt-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.cpp26
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()