From 9d5a554cc9de0ac03d2da7dc95b8ef1db4a526e9 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Tue, 14 Jan 2020 18:55:04 +0800 Subject: cmGlobalGenerator: Add cache for realpath() results Cache the results of `realpath()` system calls in `cmGlobalGenerator` to avoid repeating such calls for the same paths over and over. --- Source/cmGlobalGenerator.cxx | 11 +++++++++++ Source/cmGlobalGenerator.h | 4 ++++ Source/cmLocalGenerator.cxx | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index bcc9050..c189ea5 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -3110,6 +3111,16 @@ cmGlobalGenerator::GetFilenameTargetDepends(cmSourceFile* sf) const return this->FilenameTargetDepends[sf]; } +const std::string& cmGlobalGenerator::GetRealPath(const std::string& dir) +{ + auto i = this->RealPaths.lower_bound(dir); + if (i == this->RealPaths.end() || + this->RealPaths.key_comp()(dir, i->first)) { + i = this->RealPaths.emplace_hint(i, dir, cmSystemTools::GetRealPath(dir)); + } + return i->second; +} + void cmGlobalGenerator::ProcessEvaluationFiles() { std::vector generatedFiles; diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index f3078ac..4794853 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -485,6 +485,8 @@ public: configs.emplace_back("$"); } + std::string const& GetRealPath(std::string const& dir); + protected: // for a project collect all its targets by following depend // information, and also collect all the targets @@ -676,6 +678,8 @@ private: mutable std::map> FilenameTargetDepends; + std::map RealPaths; + #if !defined(CMAKE_BOOTSTRAP) // Pool of file locks cmFileLockPool FileLockPool; diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 1da6efe..5e39d9b 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1177,7 +1177,7 @@ std::vector> cmLocalGenerator::GetIncludeDirectoriesImplicit( } for (std::string const& i : impDirVec) { - if (implicitSet.insert(cmSystemTools::GetRealPath(i)).second) { + if (implicitSet.insert(this->GlobalGenerator->GetRealPath(i)).second) { implicitDirs.emplace_back(i); } } @@ -1188,7 +1188,7 @@ std::vector> cmLocalGenerator::GetIncludeDirectoriesImplicit( &lang](std::string const& dir) { return ( // Do not exclude directories that are not in an excluded set. - ((!cmContains(implicitSet, cmSystemTools::GetRealPath(dir))) && + ((!cmContains(implicitSet, this->GlobalGenerator->GetRealPath(dir))) && (!cmContains(implicitExclude, dir))) // Do not exclude entries of the CPATH environment variable even though // they are implicitly searched by the compiler. They are meant to be -- cgit v0.12