From b7f15d8cdf9313c62fd64df338a1d8a75148597f Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 11 Nov 2016 14:03:44 +0100 Subject: [PATCH] CMake: Do not crash when restarting a filesystem scan Change-Id: I7a86169f4dd891c91295a7d6daadfd2bac8db751 Reviewed-by: Tim Jenssen --- .../cmakeprojectmanager/builddirmanager.cpp | 32 +++++++++---------- .../cmakeprojectmanager/builddirmanager.h | 4 +-- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 63ac304d81f..53d4855ce3b 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -142,11 +142,12 @@ void BuildDirManager::updateReaderData() void BuildDirManager::parseOnceReaderReady(bool force) { - m_futureInterface.reset(new QFutureInterface>()); - m_futureWatcher.setFuture(m_futureInterface->future()); + auto fi = new QFutureInterface>(); + m_scanFuture = fi->future(); + m_futureWatcher.setFuture(m_scanFuture); - Core::ProgressManager::addTask(m_futureInterface->future(), "Scan CMake project tree", "CMake.Scan.Tree"); - Utils::runAsync([this]() { BuildDirManager::asyncScanForFiles(*m_futureInterface); }); + Core::ProgressManager::addTask(fi->future(), "Scan CMake project tree", "CMake.Scan.Tree"); + Utils::runAsync([this, fi]() { BuildDirManager::asyncScanForFiles(fi); }); checkConfiguration(); m_reader->stop(); @@ -237,9 +238,10 @@ void BuildDirManager::becameDirty() m_reparseTimer.start(1000); } -void BuildDirManager::asyncScanForFiles(QFutureInterface > &fi) +void BuildDirManager::asyncScanForFiles(QFutureInterface> *fi) { - fi.reportStarted(); + std::unique_ptr>> fip(fi); + fip->reportStarted(); Utils::MimeDatabase mdb; QList nodes @@ -274,10 +276,10 @@ void BuildDirManager::asyncScanForFiles(QFutureInterface > &fi } return new FileNode(fn, type, false); }, - &fi); - fi.setProgressValue(m_futureInterface->progressMaximum()); - fi.reportResult(nodes); - fi.reportFinished(); + fip.get()); + fip->setProgressValue(fip->progressMaximum()); + fip->reportResult(nodes); + fip->reportFinished(); } void BuildDirManager::forceReparse() @@ -298,9 +300,7 @@ void BuildDirManager::resetData() m_reader->resetData(); m_cmakeCache.clear(); - QTC_ASSERT(!m_futureInterface || m_futureInterface->isFinished(), return); - m_futureInterface.reset(); - + m_futureWatcher.setFuture(QFuture>()); m_reader.reset(); } @@ -327,16 +327,16 @@ bool BuildDirManager::persistCMakeState() void BuildDirManager::generateProjectTree(CMakeListsNode *root) { QTC_ASSERT(m_reader, return); - QTC_ASSERT(m_futureInterface, return); + QTC_ASSERT(m_scanFuture.isFinished(), return); const Utils::FileName projectFile = m_buildConfiguration->target()->project()->projectFilePath(); - QList tmp = Utils::filtered(m_futureInterface->future().result(), + QList tmp = Utils::filtered(m_scanFuture.result(), [projectFile](const FileNode *fn) -> bool { return !fn->filePath().toString().startsWith(projectFile.toString() + ".user"); }); Utils::sort(tmp, ProjectExplorer::Node::sortByPath); - m_futureInterface.reset(); // Make sure to flush the stale results + m_scanFuture = QFuture>(); // flush stale results const QList allFiles = tmp; m_reader->generateProjectTree(root, allFiles); diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.h b/src/plugins/cmakeprojectmanager/builddirmanager.h index eb670626622..f93d2248fb0 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.h +++ b/src/plugins/cmakeprojectmanager/builddirmanager.h @@ -103,7 +103,7 @@ private: void becameDirty(); - void asyncScanForFiles(QFutureInterface> &fi); + void asyncScanForFiles(QFutureInterface> *fi); CMakeBuildConfiguration *m_buildConfiguration = nullptr; mutable std::unique_ptr m_tempDir = nullptr; @@ -112,8 +112,8 @@ private: QTimer m_reparseTimer; std::unique_ptr m_reader; - std::unique_ptr>> m_futureInterface; QFutureWatcher> m_futureWatcher; + QFuture> m_scanFuture; }; } // namespace Internal