diff options
Diffstat (limited to 'src/buildtool/progress_reporting')
-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 |
3 files changed, 68 insertions, 0 deletions
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 |