aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar felly <felly@google.com>2017-06-15 02:04:24 +0200
committerGravatar Yun Peng <pcloudy@google.com>2017-06-16 09:26:59 +0200
commite17f8af42b57252cf457354faf77d56a9b230734 (patch)
tree9337428349716600b1b159633788a7e1f86bf634 /src/main/java
parent8570e4d3b248d064f36d2276225ff98e7413f87f (diff)
Mitigate GC churn in module map file writes: No need to pin entire contents in memory. Instead, write to the output stream incrementally.
PiperOrigin-RevId: 159046844
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMapAction.java17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMapAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMapAction.java
index 652700f5a0..137e22c871 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMapAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModuleMapAction.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
@@ -98,7 +99,7 @@ public final class CppModuleMapAction extends AbstractFileWriteAction {
return new DeterministicWriter() {
@Override
public void writeOutputFile(OutputStream out) throws IOException {
- StringBuilder content = new StringBuilder();
+ OutputStreamWriter content = new OutputStreamWriter(out, StandardCharsets.ISO_8859_1);
PathFragment fragment = cppModuleMap.getArtifact().getExecPath();
int segmentsToExecPath = fragment.segmentCount() - 1;
Optional<Artifact> umbrellaHeader = cppModuleMap.getUmbrellaHeader();
@@ -162,11 +163,11 @@ public final class CppModuleMapAction extends AbstractFileWriteAction {
.append(dep.getName())
.append("\" \"")
.append(leadingPeriods)
- .append(dep.getArtifact().getExecPath())
+ .append(dep.getArtifact().getExecPathString())
.append("\"");
}
}
- out.write(content.toString().getBytes(StandardCharsets.ISO_8859_1));
+ content.flush();
}
};
}
@@ -185,9 +186,9 @@ public final class CppModuleMapAction extends AbstractFileWriteAction {
return ImmutableList.copyOf(expandedHeaders);
}
- private void appendHeader(StringBuilder content, String visibilitySpecifier, PathFragment path,
- String leadingPeriods, boolean canCompile, HashSet<PathFragment> deduper,
- boolean isUmbrellaHeader) {
+ private void appendHeader(Appendable content, String visibilitySpecifier,
+ PathFragment path, String leadingPeriods, boolean canCompile, HashSet<PathFragment> deduper,
+ boolean isUmbrellaHeader) throws IOException {
if (deduper.contains(path)) {
return;
}
@@ -197,7 +198,7 @@ public final class CppModuleMapAction extends AbstractFileWriteAction {
return;
}
if (generateSubmodules) {
- content.append(" module \"").append(path).append("\" {\n");
+ content.append(" module \"").append(path.toString()).append("\" {\n");
content.append(" export *\n ");
}
content.append(" ");
@@ -207,7 +208,7 @@ public final class CppModuleMapAction extends AbstractFileWriteAction {
if (!canCompile || !shouldCompileHeader(path)) {
content.append("textual ");
}
- content.append("header \"").append(leadingPeriods).append(path).append("\"");
+ content.append("header \"").append(leadingPeriods).append(path.toString()).append("\"");
if (generateSubmodules) {
content.append("\n }");
}