summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/main/TARGETS1
-rw-r--r--src/buildtool/main/main.cpp4
-rw-r--r--src/buildtool/progress_reporting/TARGETS12
-rw-r--r--src/buildtool/progress_reporting/base_progress_reporter.cpp35
-rw-r--r--src/buildtool/progress_reporting/base_progress_reporter.hpp21
5 files changed, 72 insertions, 1 deletions
diff --git a/src/buildtool/main/TARGETS b/src/buildtool/main/TARGETS
index 6f9e2b46..6582137a 100644
--- a/src/buildtool/main/TARGETS
+++ b/src/buildtool/main/TARGETS
@@ -8,6 +8,7 @@
, ["src/buildtool/common", "config"]
, ["src/buildtool/graph_traverser", "graph_traverser"]
, ["src/buildtool/logging", "logging"]
+ , ["src/buildtool/progress_reporting", "base_progress_reporter"]
, ["src/buildtool/build_engine/base_maps", "directory_map"]
, ["src/buildtool/build_engine/base_maps", "rule_map"]
, ["src/buildtool/build_engine/base_maps", "source_map"]
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index a28ff14f..4f626a4d 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -20,6 +20,7 @@
#include "src/buildtool/common/repository_config.hpp"
#ifndef BOOTSTRAP_BUILD_TOOL
#include "src/buildtool/graph_traverser/graph_traverser.hpp"
+#include "src/buildtool/progress_reporting/base_progress_reporter.hpp"
#endif
#include "src/buildtool/logging/log_config.hpp"
#include "src/buildtool/logging/log_sink_cmdline.hpp"
@@ -1202,7 +1203,8 @@ auto main(int argc, char* argv[]) -> int {
std::move(arguments.endpoint),
std::move(arguments.build),
std::move(stage_args),
- std::move(rebuild_args)}};
+ std::move(rebuild_args)},
+ BaseProgressReporter::Reporter()};
if (arguments.cmd == SubCommand::kInstallCas) {
return FetchAndInstallArtifacts(traverser.ExecutionApi(),
diff --git a/src/buildtool/progress_reporting/TARGETS b/src/buildtool/progress_reporting/TARGETS
new file mode 100644
index 00000000..99bb1f67
--- /dev/null
+++ b/src/buildtool/progress_reporting/TARGETS
@@ -0,0 +1,12 @@
+{ "base_progress_reporter":
+ { "type": ["@", "rules", "CC", "library"]
+ , "name": ["base_progress_reporter"]
+ , "hdrs": ["base_progress_reporter.hpp"]
+ , "srcs": ["base_progress_reporter.cpp"]
+ , "stage": ["src", "buildtool", "progress_reporting"]
+ , "deps":
+ [ ["src/buildtool/graph_traverser", "graph_traverser"]
+ , ["src/buildtool/common", "common"]
+ ]
+ }
+}
diff --git a/src/buildtool/progress_reporting/base_progress_reporter.cpp b/src/buildtool/progress_reporting/base_progress_reporter.cpp
new file mode 100644
index 00000000..531e7804
--- /dev/null
+++ b/src/buildtool/progress_reporting/base_progress_reporter.cpp
@@ -0,0 +1,35 @@
+#ifndef BOOTSTRAP_BUILD_TOOL
+
+#include "src/buildtool/progress_reporting/base_progress_reporter.hpp"
+
+#include <mutex>
+
+#include "src/buildtool/common/statistics.hpp"
+#include "src/buildtool/logging/logger.hpp"
+
+auto BaseProgressReporter::Reporter() -> GraphTraverser::progress_reporter_t {
+ return [](std::atomic<bool>* done, std::condition_variable* cv) {
+ std::mutex m;
+ auto const& stats = Statistics::Instance();
+ std::unique_lock<std::mutex> lock(m);
+ int64_t delay = kStartDelayMillis;
+ while (not *done) {
+ cv->wait_for(lock, std::chrono::milliseconds(delay));
+ if (not *done) {
+ // Note: order matters; queued has to be queried last
+ int cached = stats.ActionsCachedCounter();
+ int run = stats.ActionsExecutedCounter();
+ int queued = stats.ActionsQueuedCounter();
+ Logger::Log(LogLevel::Progress,
+ "{} cached, {} run, {} processing",
+ cached,
+ run,
+ queued - run - cached);
+ }
+ delay = delay * kDelayScalingFactorNumerator /
+ kDelayScalingFactorDenominator;
+ }
+ };
+}
+
+#endif
diff --git a/src/buildtool/progress_reporting/base_progress_reporter.hpp b/src/buildtool/progress_reporting/base_progress_reporter.hpp
new file mode 100644
index 00000000..1e77ef39
--- /dev/null
+++ b/src/buildtool/progress_reporting/base_progress_reporter.hpp
@@ -0,0 +1,21 @@
+#ifndef INCLUDED_SRC_BUILDTOOL_PROGRESS_REPORTING_BASE_REPORTER_HPP
+#define INCLUDED_SRC_BUILDTOOL_PROGRESS_REPORTING_BASE_REPORTER_HPP
+
+#ifndef BOOTSTRAP_BUILD_TOOL
+
+#include "src/buildtool/graph_traverser/graph_traverser.hpp"
+
+class BaseProgressReporter {
+ public:
+ static auto Reporter() -> GraphTraverser::progress_reporter_t;
+
+ private:
+ constexpr static int64_t kStartDelayMillis = 3000;
+ // Scaling is roughly sqrt(2)
+ constexpr static int64_t kDelayScalingFactorNumerator = 99;
+ constexpr static int64_t kDelayScalingFactorDenominator = 70;
+};
+
+#endif
+
+#endif