diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/main/TARGETS | 1 | ||||
-rw-r--r-- | src/buildtool/main/main.cpp | 4 | ||||
-rw-r--r-- | src/buildtool/progress_reporting/TARGETS | 12 | ||||
-rw-r--r-- | src/buildtool/progress_reporting/base_progress_reporter.cpp | 35 | ||||
-rw-r--r-- | src/buildtool/progress_reporting/base_progress_reporter.hpp | 21 |
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 |