diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 30a393c0b60..0fe4bfe3b31 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -904,7 +904,8 @@ FilePath CMakeBuildSystem::workDirectory(const BuildDirParameters ¶meters) void CMakeBuildSystem::stopParsingAndClearState() { - qCDebug(cmakeBuildSystemLog) << "stopping parsing run!"; + qCDebug(cmakeBuildSystemLog) << cmakeBuildConfiguration()->displayName() + << "stopping parsing run!"; m_reader.stop(); m_reader.resetData(); } diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index ae3725e4a8c..2b3a086b1ec 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -165,6 +165,13 @@ void FileApiReader::stop() if (m_cmakeProcess) disconnect(m_cmakeProcess.get(), nullptr, this, nullptr); m_cmakeProcess.reset(); + + if (m_future) { + m_future->cancel(); + m_future->waitForFinished(); + } + m_future = {}; + m_isParsing = false; } bool FileApiReader::isParsing() const @@ -259,7 +266,7 @@ void FileApiReader::endState(const QFileInfo &replyFi) m_future = runAsync(ProjectExplorerPlugin::sharedThreadPool(), [replyFi, sourceDirectory, buildDirectory, topCmakeFile, cmakeBuildType]() { - auto result = std::make_unique(); + auto result = std::make_shared(); FileApiData data = FileApiParser::parseData(replyFi, cmakeBuildType, result->errorMessage); if (!result->errorMessage.isEmpty()) { qWarning() << result->errorMessage; @@ -274,29 +281,30 @@ void FileApiReader::endState(const QFileInfo &replyFi) qWarning() << result->errorMessage; } - return result.release(); + return result; }); - onFinished(m_future.value(), this, [this](const QFuture &f) { - std::unique_ptr value(f.result()); // Adopt the pointer again:-) + onResultReady(m_future.value(), + this, + [this, topCmakeFile, sourceDirectory, buildDirectory]( + const std::shared_ptr &value) { + m_isParsing = false; + m_cache = std::move(value->cache); + m_cmakeFiles = std::move(value->cmakeFiles); + m_buildTargets = std::move(value->buildTargets); + m_projectParts = std::move(value->projectParts); + m_rootProjectNode = std::move(value->rootProjectNode); + m_knownHeaders = std::move(value->knownHeaders); + m_ctestPath = std::move(value->ctestPath); + m_isMultiConfig = std::move(value->isMultiConfig); + m_usesAllCapsTargets = std::move(value->usesAllCapsTargets); - m_future = {}; - m_isParsing = false; - m_cache = std::move(value->cache); - m_cmakeFiles = std::move(value->cmakeFiles); - m_buildTargets = std::move(value->buildTargets); - m_projectParts = std::move(value->projectParts); - m_rootProjectNode = std::move(value->rootProjectNode); - m_knownHeaders = std::move(value->knownHeaders); - m_ctestPath = std::move(value->ctestPath); - m_isMultiConfig = std::move(value->isMultiConfig); - m_usesAllCapsTargets = std::move(value->usesAllCapsTargets); - - if (value->errorMessage.isEmpty()) { - emit this->dataAvailable(); - } else { - emit this->errorOccurred(value->errorMessage); - } - }); + if (value->errorMessage.isEmpty()) { + emit this->dataAvailable(); + } else { + emit this->errorOccurred(value->errorMessage); + } + m_future = {}; + }); } void FileApiReader::makeBackupConfiguration(bool store) diff --git a/src/plugins/cmakeprojectmanager/fileapireader.h b/src/plugins/cmakeprojectmanager/fileapireader.h index 25d5e1af1b8..505f5fd5065 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.h +++ b/src/plugins/cmakeprojectmanager/fileapireader.h @@ -38,6 +38,8 @@ #include #include +#include + namespace ProjectExplorer { class ProjectNode; } @@ -105,7 +107,7 @@ private: bool m_usesAllCapsTargets = false; int m_lastCMakeExitCode = 0; - Utils::optional> m_future; + Utils::optional>> m_future; // Update related: bool m_isParsing = false;