summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppprojectupdater.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cpptools/cppprojectupdater.cpp')
-rw-r--r--src/plugins/cpptools/cppprojectupdater.cpp31
1 files changed, 18 insertions, 13 deletions
diff --git a/src/plugins/cpptools/cppprojectupdater.cpp b/src/plugins/cpptools/cppprojectupdater.cpp
index d17c260930..c56b2666f0 100644
--- a/src/plugins/cpptools/cppprojectupdater.cpp
+++ b/src/plugins/cpptools/cppprojectupdater.cpp
@@ -37,8 +37,10 @@ namespace CppTools {
CppProjectUpdater::CppProjectUpdater()
{
- connect(&m_generateFutureWatcher, &QFutureWatcher<void>::finished,
- this, &CppProjectUpdater::onProjectInfoGenerated);
+ connect(&m_generateFutureWatcher,
+ &QFutureWatcher<ProjectInfo>::finished,
+ this,
+ &CppProjectUpdater::onProjectInfoGenerated);
}
CppProjectUpdater::~CppProjectUpdater()
@@ -50,7 +52,6 @@ void CppProjectUpdater::update(const ProjectExplorer::ProjectUpdateInfo &project
{
// Stop previous update.
cancelAndWaitForFinished();
- m_futureInterface = QFutureInterface<void>();
m_projectUpdateInfo = projectUpdateInfo;
@@ -60,26 +61,30 @@ 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.
- const QFuture<ProjectInfo> future = Utils::runAsync([=]() {
+ m_generateFuture = Utils::runAsync([=](QFutureInterface<ProjectInfo> &futureInterface) {
ProjectUpdateInfo fullProjectUpdateInfo = projectUpdateInfo;
if (fullProjectUpdateInfo.rppGenerator)
fullProjectUpdateInfo.rawProjectParts = fullProjectUpdateInfo.rppGenerator();
- Internal::ProjectInfoGenerator generator(m_futureInterface, fullProjectUpdateInfo);
- return generator.generate();
+ Internal::ProjectInfoGenerator generator(futureInterface, fullProjectUpdateInfo);
+ futureInterface.reportResult(generator.generate());
});
- m_generateFutureWatcher.setFuture(future);
+ m_generateFutureWatcher.setFuture(m_generateFuture);
}
void CppProjectUpdater::cancel()
{
- disconnect(&m_generateFutureWatcher);
- m_futureInterface.cancel();
+ m_generateFutureWatcher.setFuture({});
+ m_generateFuture.cancel();
+ m_updateFuture.cancel();
}
void CppProjectUpdater::cancelAndWaitForFinished()
{
cancel();
- m_futureInterface.waitForFinished();
+ if (m_generateFuture.isRunning())
+ m_generateFuture.waitForFinished();
+ if (m_updateFuture.isRunning())
+ m_updateFuture.waitForFinished();
}
void CppProjectUpdater::onToolChainRemoved(ProjectExplorer::ToolChain *t)
@@ -96,11 +101,11 @@ void CppProjectUpdater::onProjectInfoGenerated()
disconnect(ToolChainManager::instance(), &ToolChainManager::toolChainRemoved,
this, &CppProjectUpdater::onToolChainRemoved);
- if (m_futureInterface.isCanceled())
+ if (m_generateFutureWatcher.isCanceled() || m_generateFutureWatcher.future().resultCount() < 1)
return;
- QFuture<void> future = CppModelManager::instance()
- ->updateProjectInfo(m_futureInterface, m_generateFutureWatcher.result());
+ m_updateFuture = CppModelManager::instance()->updateProjectInfo(
+ m_generateFutureWatcher.result());
}
CppProjectUpdaterFactory::CppProjectUpdaterFactory()