diff options
author | nharmata <nharmata@google.com> | 2017-05-01 17:37:46 +0200 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2017-05-02 11:25:35 +0200 |
commit | 38b835097f9ae9a6062172b8a33ec2e2d1edde20 (patch) | |
tree | ddd5ac16ff3470bdc39193dd6b69fcab6de0ab5a /src/main/java/com/google/devtools/build/lib/analysis | |
parent | 2b49f678a7dfaf27afc0e44ed7a65b00ec06d413 (diff) |
Only allocate some formerly frequently allocated PathFragment objects once.
This reduces both gc churn and retained memory usage.
PiperOrigin-RevId: 154718782
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java | 13 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java | 71 |
2 files changed, 69 insertions, 15 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index f47b38d006..681c88b45a 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java @@ -1260,7 +1260,18 @@ public final class RuleContext extends TargetContext * <p>For example "pkg/dir/name" -> "pkg/<fragment>/rule/dir/name. */ public final PathFragment getUniqueDirectory(String fragment) { - return AnalysisUtils.getUniqueDirectory(getLabel(), PathFragment.create(fragment)); + return getUniqueDirectory(PathFragment.create(fragment)); + } + + /** + * Returns a path fragment qualified by the rule name and unique fragment to + * disambiguate artifacts produced from the source file appearing in + * multiple rules. + * + * <p>For example "pkg/dir/name" -> "pkg/<fragment>/rule/dir/name. + */ + public final PathFragment getUniqueDirectory(PathFragment fragment) { + return AnalysisUtils.getUniqueDirectory(getLabel(), fragment); } /** diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java index 9e11f94270..3273a6d3e6 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java @@ -1168,7 +1168,7 @@ public final class BuildConfiguration { INCLUDE(BlazeDirectories.RELATIVE_INCLUDE_DIR), OUTPUT(false); - private final String name; + private final PathFragment nameFragment; private final boolean middleman; /** @@ -1177,12 +1177,12 @@ public final class BuildConfiguration { * @param isMiddleman whether the root should be a middleman root or a "normal" derived root. */ OutputDirectory(boolean isMiddleman) { - this.name = ""; + this.nameFragment = PathFragment.EMPTY_FRAGMENT; this.middleman = isMiddleman; } OutputDirectory(String name) { - this.name = name; + this.nameFragment = PathFragment.create(name); this.middleman = false; } @@ -1198,16 +1198,29 @@ public final class BuildConfiguration { } // e.g., [[execroot/repo1]/bazel-out/config/bin] return INTERNER.intern( - Root.asDerivedRoot(execRoot, outputDir.getRelative(name), repositoryName.isMain())); + Root.asDerivedRoot( + execRoot, + outputDir.getRelative(nameFragment), + repositoryName.isMain())); } } - // "Cache" of roots, so we don't keep around thousands of copies of the same root. - private static Interner<Root> INTERNER = Interners.newWeakInterner(); - private final BlazeDirectories directories; private final String outputDirName; + // We intern the roots for non-main repositories, so we don't keep around thousands of copies of + // the same root. + private static Interner<Root> INTERNER = Interners.newWeakInterner(); + + // We precompute the roots for the main repository, since that's the common case. + private final Root outputDirectoryForMainRepository; + private final Root binDirectoryForMainRepository; + private final Root includeDirectoryForMainRepository; + private final Root genfilesDirectoryForMainRepository; + private final Root coverageDirectoryForMainRepository; + private final Root testlogsDirectoryForMainRepository; + private final Root middlemanDirectoryForMainRepository; + /** If false, AnalysisEnviroment doesn't register any actions created by the ConfiguredTarget. */ private final boolean actionsEnabled; @@ -1444,6 +1457,22 @@ public final class BuildConfiguration { this.mnemonic = buildMnemonic(); this.outputDirName = (options.outputDirectoryName != null) ? options.outputDirectoryName : mnemonic; + + this.outputDirectoryForMainRepository = + OutputDirectory.OUTPUT.getRoot(RepositoryName.MAIN, outputDirName, directories); + this.binDirectoryForMainRepository = + OutputDirectory.BIN.getRoot(RepositoryName.MAIN, outputDirName, directories); + this.includeDirectoryForMainRepository = + OutputDirectory.INCLUDE.getRoot(RepositoryName.MAIN, outputDirName, directories); + this.genfilesDirectoryForMainRepository = + OutputDirectory.GENFILES.getRoot(RepositoryName.MAIN, outputDirName, directories); + this.coverageDirectoryForMainRepository = + OutputDirectory.COVERAGE.getRoot(RepositoryName.MAIN, outputDirName, directories); + this.testlogsDirectoryForMainRepository = + OutputDirectory.TESTLOGS.getRoot(RepositoryName.MAIN, outputDirName, directories); + this.middlemanDirectoryForMainRepository = + OutputDirectory.MIDDLEMAN.getRoot(RepositoryName.MAIN, outputDirName, directories); + this.platformName = buildPlatformName(); this.shellExecutable = computeShellExecutable(); @@ -2068,7 +2097,9 @@ public final class BuildConfiguration { * Returns the output directory for this build configuration. */ public Root getOutputDirectory(RepositoryName repositoryName) { - return OutputDirectory.OUTPUT.getRoot(repositoryName, outputDirName, directories); + return repositoryName.equals(RepositoryName.MAIN) + ? outputDirectoryForMainRepository + : OutputDirectory.OUTPUT.getRoot(repositoryName, outputDirName, directories); } /** @@ -2087,7 +2118,9 @@ public final class BuildConfiguration { * repositories (external) but will need to be fixed. */ public Root getBinDirectory(RepositoryName repositoryName) { - return OutputDirectory.BIN.getRoot(repositoryName, outputDirName, directories); + return repositoryName.equals(RepositoryName.MAIN) + ? binDirectoryForMainRepository + : OutputDirectory.BIN.getRoot(repositoryName, outputDirName, directories); } /** @@ -2101,7 +2134,9 @@ public final class BuildConfiguration { * Returns the include directory for this build configuration. */ public Root getIncludeDirectory(RepositoryName repositoryName) { - return OutputDirectory.INCLUDE.getRoot(repositoryName, outputDirName, directories); + return repositoryName.equals(RepositoryName.MAIN) + ? includeDirectoryForMainRepository + : OutputDirectory.INCLUDE.getRoot(repositoryName, outputDirName, directories); } /** @@ -2114,7 +2149,9 @@ public final class BuildConfiguration { } public Root getGenfilesDirectory(RepositoryName repositoryName) { - return OutputDirectory.GENFILES.getRoot(repositoryName, outputDirName, directories); + return repositoryName.equals(RepositoryName.MAIN) + ? genfilesDirectoryForMainRepository + : OutputDirectory.GENFILES.getRoot(repositoryName, outputDirName, directories); } /** @@ -2123,14 +2160,18 @@ public final class BuildConfiguration { * needed for Jacoco's coverage reporting tools. */ public Root getCoverageMetadataDirectory(RepositoryName repositoryName) { - return OutputDirectory.COVERAGE.getRoot(repositoryName, outputDirName, directories); + return repositoryName.equals(RepositoryName.MAIN) + ? coverageDirectoryForMainRepository + : OutputDirectory.COVERAGE.getRoot(repositoryName, outputDirName, directories); } /** * Returns the testlogs directory for this build configuration. */ public Root getTestLogsDirectory(RepositoryName repositoryName) { - return OutputDirectory.TESTLOGS.getRoot(repositoryName, outputDirName, directories); + return repositoryName.equals(RepositoryName.MAIN) + ? testlogsDirectoryForMainRepository + : OutputDirectory.TESTLOGS.getRoot(repositoryName, outputDirName, directories); } /** @@ -2157,7 +2198,9 @@ public final class BuildConfiguration { * Returns the internal directory (used for middlemen) for this build configuration. */ public Root getMiddlemanDirectory(RepositoryName repositoryName) { - return OutputDirectory.MIDDLEMAN.getRoot(repositoryName, outputDirName, directories); + return repositoryName.equals(RepositoryName.MAIN) + ? middlemanDirectoryForMainRepository + : OutputDirectory.MIDDLEMAN.getRoot(repositoryName, outputDirName, directories); } public boolean getAllowRuntimeDepsOnNeverLink() { |