From 300afe8b8d3a919b2e4d7e5f30e9d4dfd341eb1d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 6 Apr 2018 12:21:34 +0200 Subject: [PATCH] QbsProjectManager: Cache run environment Setting up the qbs run environment is not free, and the respective code gets triggered from other plugins much more often than expected. Task-number: QTCREATORBUG-20175 Change-Id: I6529718d20738140963486caef103d6d17958d50 Reviewed-by: Christian Stenger --- src/plugins/qbsprojectmanager/qbsproject.cpp | 2 ++ src/plugins/qbsprojectmanager/qbsproject.h | 3 +++ src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp | 8 ++++++++ src/plugins/qbsprojectmanager/qbsrunconfiguration.h | 5 +++++ 4 files changed, 18 insertions(+) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 4b1691cc8d8..7225ec38fbc 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -452,6 +452,7 @@ void QbsProject::updateAfterParse() updateCppCodeModel(); updateQmlJsCodeModel(); emit fileListChanged(); + emit dataChanged(); } void QbsProject::delayedUpdateAfterParse() @@ -609,6 +610,7 @@ void QbsProject::updateAfterBuild() m_extraCompilersPending = false; updateCppCodeModel(); } + emit dataChanged(); } void QbsProject::registerQbsProjectParser(QbsProjectParser *p) diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index afa2473f337..82a2f998367 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -107,6 +107,9 @@ public: void delayParsing(); +signals: + void dataChanged(); + private: void handleQbsParsingDone(bool success); diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index ca0ed33f0c0..43ed3c16362 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -109,6 +109,7 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target) if (success && !terminalAspect->isUserSet()) terminalAspect->setUseTerminal(isConsoleApplication()); }); + connect(project, &QbsProject::dataChanged, this, [this] { m_envCache.clear(); }); connect(BuildManager::instance(), &BuildManager::buildStateChanged, this, [this, project](Project *p) { if (p == project && !BuildManager::isBuilding(p)) { @@ -255,6 +256,12 @@ QString QbsRunConfiguration::baseWorkingDirectory() const void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const { + const auto key = qMakePair(env.toStringList(), m_usingLibraryPaths); + const auto it = m_envCache.constFind(key); + if (it != m_envCache.constEnd()) { + env = it.value(); + return; + } QbsProject *project = static_cast(target()->project()); if (project && project->qbsProject().isValid()) { const qbs::ProductData product = findProduct(project->qbsProjectData(), uniqueProductName()); @@ -279,6 +286,7 @@ void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const } } } + m_envCache.insert(key, env); } QString QbsRunConfiguration::buildSystemTarget() const diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index 99761216064..a0cf9506b3a 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -28,7 +28,9 @@ #include #include +#include #include +#include #include #include @@ -83,6 +85,9 @@ private: void updateTarget(); + using EnvCache = QHash, Utils::Environment>; + mutable EnvCache m_envCache; + QbsInstallStep *m_currentInstallStep = nullptr; // We do not take ownership! ProjectExplorer::BuildStepList *m_currentBuildStepList = nullptr; // We do not take ownership! QString m_uniqueProductName;