From 63c0fbc4e407e1829a5e3eb0418f103b269367bf Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 1 Dec 2016 15:25:32 +0100 Subject: [PATCH] CMake: Cache cmake configuration only once This fixes saves memory and fixes some update issues with the cmake configuration, where the three layers of caches used to interfere with each other. Task-number: QTCREATORBUG-17360 Change-Id: I5564bbe46ca8de6b38dd710100bfc18fad98eac5 Reviewed-by: Tim Jenssen --- src/plugins/cmakeprojectmanager/builddirmanager.cpp | 6 ++++-- src/plugins/cmakeprojectmanager/builddirreader.h | 2 +- .../cmakeprojectmanager/cmakebuildconfiguration.cpp | 7 ++----- src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h | 2 -- src/plugins/cmakeprojectmanager/servermodereader.cpp | 6 ++++-- src/plugins/cmakeprojectmanager/servermodereader.h | 2 +- src/plugins/cmakeprojectmanager/tealeafreader.cpp | 7 +++---- src/plugins/cmakeprojectmanager/tealeafreader.h | 3 +-- 8 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 65ddce01ead..b92581410b4 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -148,6 +148,8 @@ void BuildDirManager::parseOnceReaderReady(bool force) m_scanFuture = fi->future(); m_futureWatcher.setFuture(m_scanFuture); + m_cmakeCache.clear(); + Core::ProgressManager::addTask(fi->future(), "Scan CMake project tree", "CMake.Scan.Tree"); Utils::runAsync([this, fi]() { BuildDirManager::asyncScanForFiles(fi); }); @@ -411,7 +413,7 @@ CMakeConfig BuildDirManager::parsedConfiguration() const if (!m_reader) return m_cmakeCache; if (m_cmakeCache.isEmpty()) - m_cmakeCache = m_reader->parsedConfiguration(); + m_cmakeCache = m_reader->takeParsedConfiguration(); return m_cmakeCache; } @@ -421,7 +423,7 @@ void BuildDirManager::checkConfiguration() return; Kit *k = m_buildConfiguration->target()->kit(); - const CMakeConfig cache = m_reader->parsedConfiguration(); + const CMakeConfig cache = parsedConfiguration(); if (cache.isEmpty()) return; // No cache file yet. diff --git a/src/plugins/cmakeprojectmanager/builddirreader.h b/src/plugins/cmakeprojectmanager/builddirreader.h index d23df0020ef..8aca7dd99cc 100644 --- a/src/plugins/cmakeprojectmanager/builddirreader.h +++ b/src/plugins/cmakeprojectmanager/builddirreader.h @@ -100,7 +100,7 @@ public: virtual bool isParsing() const = 0; virtual bool hasData() const = 0; - virtual CMakeConfig parsedConfiguration() const = 0; + virtual CMakeConfig takeParsedConfiguration() = 0; virtual QList buildTargets() const = 0; virtual void generateProjectTree(CMakeListsNode *root, const QList &allFiles) = 0; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index da33bd340aa..65ca6d95750 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -146,7 +146,7 @@ void CMakeBuildConfiguration::ctor() connect(m_buildDirManager.get(), &BuildDirManager::errorOccured, this, &CMakeBuildConfiguration::setError); connect(m_buildDirManager.get(), &BuildDirManager::configurationStarted, - this, [this]() { m_completeConfigurationCache.clear(); emit parsingStarted(); }); + this, &CMakeBuildConfiguration::parsingStarted); connect(this, &CMakeBuildConfiguration::environmentChanged, m_buildDirManager.get(), &BuildDirManager::forceReparse); @@ -259,10 +259,7 @@ QList CMakeBuildConfiguration::completeCMakeConfiguration if (!m_buildDirManager || m_buildDirManager->isParsing()) return QList(); - if (m_completeConfigurationCache.isEmpty()) - m_completeConfigurationCache = m_buildDirManager->parsedConfiguration(); - - return Utils::transform(m_completeConfigurationCache, + return Utils::transform(m_buildDirManager->parsedConfiguration(), [this](const CMakeConfigItem &i) { ConfigModel::DataItem j; j.key = QString::fromUtf8(i.key); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 04a4f096816..3c8723e3c0f 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -118,8 +118,6 @@ private: QString m_error; QString m_warning; - mutable QList m_completeConfigurationCache; - std::unique_ptr m_buildDirManager; friend class CMakeBuildSettingsWidget; diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index cf3c765febf..30f13b89938 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -213,9 +213,11 @@ QList ServerModeReader::buildTargets() const return result; } -CMakeConfig ServerModeReader::parsedConfiguration() const +CMakeConfig ServerModeReader::takeParsedConfiguration() { - return m_cmakeCache; + CMakeConfig config = m_cmakeCache; + m_cmakeCache.clear(); + return config; } FolderNode *setupCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index f0692bb83a4..4b5936039b5 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -63,7 +63,7 @@ public: bool hasData() const final; QList buildTargets() const final; - CMakeConfig parsedConfiguration() const final; + CMakeConfig takeParsedConfiguration() final; void generateProjectTree(CMakeListsNode *root, const QList &allFiles) final; QSet updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder) final; diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index 68e0c3ec70e..c730db73621 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -163,7 +163,6 @@ void TeaLeafReader::resetData() qDeleteAll(m_watchedFiles); m_watchedFiles.clear(); - m_cmakeCache.clear(); m_projectName.clear(); m_buildTargets.clear(); qDeleteAll(m_files); @@ -221,7 +220,7 @@ QList TeaLeafReader::buildTargets() const return m_buildTargets; } -CMakeConfig TeaLeafReader::parsedConfiguration() const +CMakeConfig TeaLeafReader::takeParsedConfiguration() { CMakeConfig result; FileName cacheFile = m_parameters.buildDirectory; @@ -229,11 +228,11 @@ CMakeConfig TeaLeafReader::parsedConfiguration() const if (!cacheFile.exists()) return result; QString errorMessage; - m_cmakeCache = CMakeConfigItem::itemsFromFile(cacheFile, &errorMessage); + result = CMakeConfigItem::itemsFromFile(cacheFile, &errorMessage); if (!errorMessage.isEmpty()) emit errorOccured(errorMessage); const FileName sourceOfBuildDir - = FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", m_cmakeCache)); + = FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", result)); const FileName canonicalSourceOfBuildDir = FileUtils::canonicalPath(sourceOfBuildDir); const FileName canonicalSourceDirectory = FileUtils::canonicalPath(m_parameters.sourceDirectory); if (canonicalSourceOfBuildDir != canonicalSourceDirectory) { // Uses case-insensitive compare where appropriate diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.h b/src/plugins/cmakeprojectmanager/tealeafreader.h index 7451de7ed9b..5c09e577995 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.h +++ b/src/plugins/cmakeprojectmanager/tealeafreader.h @@ -55,7 +55,7 @@ public: bool hasData() const final; QList buildTargets() const final; - CMakeConfig parsedConfiguration() const final; + CMakeConfig takeParsedConfiguration() final; void generateProjectTree(CMakeListsNode *root, const QList &allFiles) final; QSet updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder) final; @@ -82,7 +82,6 @@ private: bool m_hasData = false; - mutable CMakeConfig m_cmakeCache; QSet m_cmakeFiles; QString m_projectName; QList m_buildTargets;