From fa6490efbcc486edbb8c344bc83c1370826d9fc3 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 10 Jun 2021 10:31:53 +0200 Subject: [PATCH] CMake: Avoid iterating project tree for each build target Reduces lock-up in main thread after loading projects Task-number: QTCREATORBUG-25783 Change-Id: Ie769074f1689698379bd6fd60f74957086cfce37 Reviewed-by: hjk --- .../cmakeprojectmanager/cmakebuildsystem.cpp | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 243fdb83f9f..3f90ec7a4c5 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -623,18 +623,22 @@ void CMakeBuildSystem::updateProjectData() if (newRoot) { setRootProjectNode(std::move(newRoot)); - const FilePath buildDir = cmakeBuildConfiguration()->buildDirectory(); - if (p->rootProjectNode()) { + if (QTC_GUARD(p->rootProjectNode())) { const QString nodeName = p->rootProjectNode()->displayName(); p->setDisplayName(nodeName); - } - for (const CMakeBuildTarget &bt : qAsConst(m_buildTargets)) { - const QString buildKey = bt.title; - if (ProjectNode *node = p->findNodeForBuildKey(buildKey)) { - if (auto targetNode = dynamic_cast(node)) - targetNode->setConfig(patchedConfig); - } + // set config on target nodes + const QSet buildKeys = Utils::transform(m_buildTargets, + &CMakeBuildTarget::title); + p->rootProjectNode()->forEachProjectNode( + [patchedConfig, buildKeys](const ProjectNode *node) { + if (buildKeys.contains(node->buildKey())) { + auto targetNode = const_cast( + dynamic_cast(node)); + if (QTC_GUARD(targetNode)) + targetNode->setConfig(patchedConfig); + } + }); } } }