Link process tools with the lite proto runtime to cut their size to tenth.
RELNOTES: None.
PiperOrigin-RevId: 245412749
diff --git a/src/main/protobuf/execution_statistics.proto b/src/main/protobuf/execution_statistics.proto
index 86bfe35..ed761890 100644
--- a/src/main/protobuf/execution_statistics.proto
+++ b/src/main/protobuf/execution_statistics.proto
@@ -18,6 +18,7 @@
option java_package = "com.google.devtools.build.lib.shell";
option java_outer_classname = "Protos";
+option optimize_for = LITE_RUNTIME;
// Verbatim representation of the rusage structure returned by getrusage(2).
// For further details on all these cryptic names, see that manual page.
diff --git a/src/main/tools/process-tools.cc b/src/main/tools/process-tools.cc
index 45aa6b7..0b5ecb94 100644
--- a/src/main/tools/process-tools.cc
+++ b/src/main/tools/process-tools.cc
@@ -242,9 +242,24 @@
std::unique_ptr<tools::protos::ExecutionStatistics> execution_statistics =
CreateExecutionStatisticsProto(rusage);
+ std::string serialized = execution_statistics->SerializeAsString();
- if (!execution_statistics->SerializeToFileDescriptor(fd_out)) {
- DIE("could not write resource usage to file: %s", stats_path.c_str());
+ if (serialized.empty()) {
+ DIE("invalid execution statistics message");
+ }
+
+ const char *remaining = serialized.c_str();
+ ssize_t remaining_size = serialized.size();
+
+ while (remaining_size > 0) {
+ ssize_t written = write(fd_out, remaining, remaining_size);
+ if (written < 0 && errno != EINTR && errno != EAGAIN) {
+ DIE("could not write resource usage to file '%s': %s",
+ stats_path.c_str(), strerror(errno));
+ }
+
+ remaining_size -= written;
+ remaining += written;
}
close(fd_out);