summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/build.cc26
-rw-r--r--src/build.h11
-rw-r--r--src/build_test.cc9
3 files changed, 21 insertions, 25 deletions
diff --git a/src/build.cc b/src/build.cc
index f04e2f2..3b1a3f4 100644
--- a/src/build.cc
+++ b/src/build.cc
@@ -81,7 +81,7 @@ bool DryRunCommandRunner::WaitForCommand(Result* result) {
BuildStatus::BuildStatus(const BuildConfig& config)
: config_(config),
- started_edges_(0), finished_edges_(0), total_edges_(0),
+ started_edges_(0), finished_edges_(0), total_edges_(0), running_edges_(0),
time_millis_(0), progress_status_format_(NULL),
current_rate_(config.parallelism) {
// Don't do anything fancy in verbose mode.
@@ -103,7 +103,7 @@ void BuildStatus::BuildEdgeStarted(const Edge* edge,
time_millis_ = start_time_millis;
if (edge->use_console() || printer_.is_smart_terminal())
- PrintStatus(edge, start_time_millis, kEdgeStarted);
+ PrintStatus(edge, start_time_millis);
if (edge->use_console())
printer_.SetConsoleLocked(true);
@@ -122,7 +122,12 @@ void BuildStatus::BuildEdgeFinished(Edge* edge, int64_t end_time_millis,
return;
if (!edge->use_console())
- PrintStatus(edge, end_time_millis, kEdgeFinished);
+ PrintStatus(edge, end_time_millis);
+
+ // Update running_edges_ after PrintStatus so that the number of running
+ // edges doesn't oscillate between config.parallelism_ and
+ // config.parallelism_ - 1.
+ --running_edges_;
// Print the command that is spewing before printing its output.
if (!success) {
@@ -185,6 +190,9 @@ void BuildStatus::BuildLoadDyndeps() {
}
void BuildStatus::BuildStarted() {
+ started_edges_ = 0;
+ finished_edges_ = 0;
+ running_edges_ = 0;
}
void BuildStatus::BuildFinished() {
@@ -193,7 +201,7 @@ void BuildStatus::BuildFinished() {
}
string BuildStatus::FormatProgressStatus(
- const char* progress_status_format, int64_t time, EdgeStatus status) const {
+ const char* progress_status_format, int64_t time) const {
string out;
char buf[32];
for (const char* s = progress_status_format; *s != '\0'; ++s) {
@@ -218,11 +226,7 @@ string BuildStatus::FormatProgressStatus(
// Running edges.
case 'r': {
- int running_edges = started_edges_ - finished_edges_;
- // count the edge that just finished as a running edge
- if (status == kEdgeFinished)
- running_edges++;
- snprintf(buf, sizeof(buf), "%d", running_edges);
+ snprintf(buf, sizeof(buf), "%d", running_edges_);
out += buf;
break;
}
@@ -278,7 +282,7 @@ string BuildStatus::FormatProgressStatus(
return out;
}
-void BuildStatus::PrintStatus(const Edge* edge, int64_t time, EdgeStatus status) {
+void BuildStatus::PrintStatus(const Edge* edge, int64_t time) {
if (config_.verbosity == BuildConfig::QUIET)
return;
@@ -288,7 +292,7 @@ void BuildStatus::PrintStatus(const Edge* edge, int64_t time, EdgeStatus status)
if (to_print.empty() || force_full_command)
to_print = edge->GetBinding("command");
- to_print = FormatProgressStatus(progress_status_format_, time, status) + to_print;
+ to_print = FormatProgressStatus(progress_status_format_, time) + to_print;
printer_.Print(to_print,
force_full_command ? LinePrinter::FULL : LinePrinter::ELIDE);
diff --git a/src/build.h b/src/build.h
index 6935086..265723a 100644
--- a/src/build.h
+++ b/src/build.h
@@ -252,25 +252,20 @@ struct BuildStatus {
void BuildStarted();
void BuildFinished();
- enum EdgeStatus {
- kEdgeStarted,
- kEdgeFinished,
- };
-
/// Format the progress status string by replacing the placeholders.
/// See the user manual for more information about the available
/// placeholders.
/// @param progress_status_format The format of the progress status.
/// @param status The status of the edge.
std::string FormatProgressStatus(const char* progress_status_format,
- int64_t time, EdgeStatus status) const;
+ int64_t time) const;
private:
- void PrintStatus(const Edge* edge, int64_t time, EdgeStatus status);
+ void PrintStatus(const Edge* edge, int64_t time);
const BuildConfig& config_;
- int started_edges_, finished_edges_, total_edges_;
+ int started_edges_, finished_edges_, total_edges_, running_edges_;
int64_t time_millis_;
/// Prints progress output.
diff --git a/src/build_test.cc b/src/build_test.cc
index 4ccb2c4..1baec65 100644
--- a/src/build_test.cc
+++ b/src/build_test.cc
@@ -1400,8 +1400,7 @@ TEST_F(BuildWithLogTest, RestatTest) {
ASSERT_EQ("", err);
EXPECT_TRUE(builder_.Build(&err));
ASSERT_EQ("", err);
- EXPECT_EQ("[3/3]", builder_.status_->FormatProgressStatus("[%s/%t]", 0,
- BuildStatus::kEdgeStarted));
+ EXPECT_EQ("[3/3]", builder_.status_->FormatProgressStatus("[%s/%t]", 0));
command_runner_.commands_ran_.clear();
state_.Reset();
@@ -1843,14 +1842,12 @@ TEST_F(BuildTest, StatusFormatElapsed) {
status_.BuildStarted();
// Before any task is done, the elapsed time must be zero.
EXPECT_EQ("[%/e0.000]",
- status_.FormatProgressStatus("[%%/e%e]", 0,
- BuildStatus::kEdgeStarted));
+ status_.FormatProgressStatus("[%%/e%e]", 0));
}
TEST_F(BuildTest, StatusFormatReplacePlaceholder) {
EXPECT_EQ("[%/s0/t0/r0/u0/f0]",
- status_.FormatProgressStatus("[%%/s%s/t%t/r%r/u%u/f%f]", 0,
- BuildStatus::kEdgeStarted));
+ status_.FormatProgressStatus("[%%/s%s/t%t/r%r/u%u/f%f]", 0));
}
TEST_F(BuildTest, FailedDepsParse) {