aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis
diff options
context:
space:
mode:
authorGravatar nharmata <nharmata@google.com>2017-05-01 17:37:46 +0200
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-05-02 11:25:35 +0200
commit38b835097f9ae9a6062172b8a33ec2e2d1edde20 (patch)
treeddd5ac16ff3470bdc39193dd6b69fcab6de0ab5a /src/main/java/com/google/devtools/build/lib/analysis
parent2b49f678a7dfaf27afc0e44ed7a65b00ec06d413 (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.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java71
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/&lt;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/&lt;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() {