diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/computed_roots/TARGETS | 1 | ||||
-rw-r--r-- | src/buildtool/computed_roots/evaluate.cpp | 28 |
2 files changed, 27 insertions, 2 deletions
diff --git a/src/buildtool/computed_roots/TARGETS b/src/buildtool/computed_roots/TARGETS index 46f9ea0b..208711df 100644 --- a/src/buildtool/computed_roots/TARGETS +++ b/src/buildtool/computed_roots/TARGETS @@ -78,6 +78,7 @@ , ["src/buildtool/logging", "logging"] , ["src/buildtool/main", "analyse_context"] , ["src/buildtool/multithreading", "async_map_consumer"] + , ["src/buildtool/multithreading", "async_map_utils"] , ["src/buildtool/multithreading", "task_system"] , ["src/buildtool/progress_reporting", "base_progress_reporter"] , ["src/buildtool/progress_reporting", "progress"] diff --git a/src/buildtool/computed_roots/evaluate.cpp b/src/buildtool/computed_roots/evaluate.cpp index 06beccec..202fc7d1 100644 --- a/src/buildtool/computed_roots/evaluate.cpp +++ b/src/buildtool/computed_roots/evaluate.cpp @@ -51,6 +51,7 @@ #include "src/buildtool/logging/logger.hpp" #include "src/buildtool/main/analyse_context.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" +#include "src/buildtool/multithreading/async_map_utils.hpp" #include "src/buildtool/multithreading/task_system.hpp" #include "src/buildtool/progress_reporting/base_progress_reporter.hpp" #include "src/buildtool/progress_reporting/progress.hpp" @@ -498,12 +499,13 @@ auto EvaluateComputedRoots( &repo_config_access, &git_access); bool failed = false; + bool done = false; { TaskSystem ts{jobs}; root_map.ConsumeAfterKeysReady( &ts, roots, - [&roots](auto values) { + [&roots, &done](auto values) { Logger::Log(LogLevel::Progress, "Computed roots evaluted, {} top level", roots.size()); @@ -517,6 +519,7 @@ auto EvaluateComputedRoots( } return msg.str(); }); + done = true; }, [&failed](auto const& msg, bool fatal) { Logger::Log( @@ -528,7 +531,28 @@ auto EvaluateComputedRoots( ); } - return (not failed); + if (failed) { + return false; + } + if (not done) { + const std::function<std::string(FileRoot::ComputedRoot const&)> + k_root_printer = + [](FileRoot::ComputedRoot const& x) -> std::string { + return x.ToString(); + }; + + auto cycle_msg = DetectAndReportCycle( + "computed roots", root_map, k_root_printer); + if (cycle_msg) { + Logger::Log(LogLevel::Error, "{}", *cycle_msg); + } + else { + DetectAndReportPending( + "computed roots", root_map, k_root_printer); + } + return false; + } + return true; } return true; } |