From bad66c1fc29060c58172613f6db2e25a44085684 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 12 Jan 2023 23:32:11 +0100 Subject: [PATCH] CMakeBuildSystem: Run ctest process asynchronously in main thread Instead of running it in other thread using blocking interface. Amends 675a72e29648844eca625202ee56da9280b6ac22 Change-Id: Ia4c7701fa4cd9efea4aeccd979dfb8cde28a889e Reviewed-by: Christian Stenger Reviewed-by: --- .../cmakeprojectmanager/cmakebuildsystem.cpp | 43 +++++-------------- .../cmakeprojectmanager/cmakebuildsystem.h | 4 +- 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 30437969622..85708ba07d8 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -10,7 +10,6 @@ #include "cmakekitinformation.h" #include "cmakeproject.h" #include "cmakeprojectconstants.h" -#include "cmakeprojectnodes.h" #include "cmakeprojectmanagertr.h" #include "cmakeprojectplugin.h" #include "cmakespecificsettings.h" @@ -24,14 +23,11 @@ #include #include -#include -#include #include #include #include #include -#include #include #include @@ -45,15 +41,11 @@ #include #include #include -#include #include #include -#include #include -#include #include -#include #include #include #include @@ -191,7 +183,6 @@ CMakeBuildSystem::CMakeBuildSystem(CMakeBuildConfiguration *bc) CMakeBuildSystem::~CMakeBuildSystem() { - m_futureSynchronizer.waitForFinished(); if (!m_treeScanner.isFinished()) { auto future = m_treeScanner.future(); future.cancel(); @@ -914,26 +905,15 @@ void CMakeBuildSystem::runCTest() const BuildDirParameters parameters(this); QTC_ASSERT(parameters.isValid(), return); - const CommandLine cmd { m_ctestPath, { "-N", "--show-only=json-v1" } }; ensureBuildDirectory(parameters); - const FilePath workingDirectory = parameters.buildDirectory; - const Environment environment = buildConfiguration()->environment(); - - auto future = Utils::runAsync([cmd, workingDirectory, environment] - (QFutureInterface &futureInterface) { - QtcProcess process; - process.setEnvironment(environment); - process.setWorkingDirectory(workingDirectory); - process.setCommand(cmd); - process.start(); - if (!process.waitForFinished() || process.result() != ProcessResult::FinishedWithSuccess) - return; - futureInterface.reportResult(process.readAllRawStandardOutput()); - }); - - Utils::onFinished(future, this, [this](const QFuture &future) { - if (future.resultCount()) { - const QJsonDocument json = QJsonDocument::fromJson(future.result()); + m_ctestProcess.reset(new QtcProcess); + m_ctestProcess->setEnvironment(buildConfiguration()->environment()); + m_ctestProcess->setWorkingDirectory(parameters.buildDirectory); + m_ctestProcess->setCommand({m_ctestPath, { "-N", "--show-only=json-v1"}}); + connect(m_ctestProcess.get(), &QtcProcess::done, this, [this] { + if (m_ctestProcess->result() == ProcessResult::FinishedWithSuccess) { + const QJsonDocument json + = QJsonDocument::fromJson(m_ctestProcess->readAllRawStandardOutput()); if (!json.isEmpty() && json.isObject()) { const QJsonObject jsonObj = json.object(); const QJsonObject btGraph = jsonObj.value("backtraceGraph").toObject(); @@ -972,8 +952,7 @@ void CMakeBuildSystem::runCTest() } emit testInformationUpdated(); }); - - m_futureSynchronizer.addFuture(future); + m_ctestProcess->start(); } CMakeBuildConfiguration *CMakeBuildSystem::cmakeBuildConfiguration() const @@ -981,7 +960,7 @@ CMakeBuildConfiguration *CMakeBuildSystem::cmakeBuildConfiguration() const return static_cast(BuildSystem::buildConfiguration()); } -static Utils::FilePaths librarySearchPaths(const CMakeBuildSystem *bs, const QString &buildKey) +static FilePaths librarySearchPaths(const CMakeBuildSystem *bs, const QString &buildKey) { const CMakeBuildTarget cmakeBuildTarget = Utils::findOrDefault(bs->buildTargets(), Utils::equal(&CMakeBuildTarget::title, buildKey)); @@ -1359,7 +1338,7 @@ QList> CMakeBuildSystem::generators() const return result; } -void CMakeBuildSystem::runGenerator(Utils::Id id) +void CMakeBuildSystem::runGenerator(Id id) { QTC_ASSERT(cmakeBuildConfiguration(), return); const auto showError = [](const QString &detail) { diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h index 54bcf20dacc..e9b1acedc73 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h @@ -11,7 +11,6 @@ #include #include -#include #include namespace CppEditor { class CppProjectUpdater; } @@ -19,6 +18,7 @@ namespace ProjectExplorer { class ExtraCompiler; class FolderNode; } +namespace Utils { class QtcProcess; } namespace CMakeProjectManager { @@ -206,8 +206,8 @@ private: // CTest integration Utils::FilePath m_ctestPath; + std::unique_ptr m_ctestProcess; QList m_testNames; - Utils::FutureSynchronizer m_futureSynchronizer; CMakeConfig m_configurationFromCMake; CMakeConfig m_configurationChanges;