summaryrefslogtreecommitdiffstats
path: root/src/build.cc
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2016-04-19 19:13:59 (GMT)
committerNico Weber <nicolasweber@gmx.de>2016-04-19 19:13:59 (GMT)
commit10ef5bf7f965b92e79777309f62ffc3fc9787065 (patch)
tree9f66af0db12b6e7cbec93f8c292395671cd5a3de /src/build.cc
parentad671a63490096321fcc4c60128acdc5c5b06f23 (diff)
parentff6eedb968ddd6f0f9ba252a31e5a77967edddb5 (diff)
downloadNinja-10ef5bf7f965b92e79777309f62ffc3fc9787065.zip
Ninja-10ef5bf7f965b92e79777309f62ffc3fc9787065.tar.gz
Ninja-10ef5bf7f965b92e79777309f62ffc3fc9787065.tar.bz2
Merge pull request #1126 from bradking/pool-release-on-fail
Release the pool slot held by an edge whether it succeeds or fails
Diffstat (limited to 'src/build.cc')
-rw-r--r--src/build.cc25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/build.cc b/src/build.cc
index f6f022e..0971a87 100644
--- a/src/build.cc
+++ b/src/build.cc
@@ -385,20 +385,25 @@ void Plan::ScheduleWork(Edge* edge) {
}
}
-void Plan::EdgeFinished(Edge* edge) {
+void Plan::EdgeFinished(Edge* edge, bool success) {
map<Edge*, bool>::iterator e = want_.find(edge);
assert(e != want_.end());
bool directly_wanted = e->second;
- if (directly_wanted)
- --wanted_edges_;
- want_.erase(e);
- edge->outputs_ready_ = true;
// See if this job frees up any delayed jobs.
if (directly_wanted)
edge->pool()->EdgeFinished(*edge);
edge->pool()->RetrieveReadyEdges(&ready_);
+ // The rest of this function only applies to successful commands.
+ if (!success)
+ return;
+
+ if (directly_wanted)
+ --wanted_edges_;
+ want_.erase(e);
+ edge->outputs_ready_ = true;
+
// Check off any nodes we were waiting for with this edge.
for (vector<Node*>::iterator o = edge->outputs_.begin();
o != edge->outputs_.end(); ++o) {
@@ -421,7 +426,7 @@ void Plan::NodeFinished(Node* node) {
} else {
// We do not need to build this edge, but we might need to build one of
// its dependents.
- EdgeFinished(*oe);
+ EdgeFinished(*oe, true);
}
}
}
@@ -654,7 +659,7 @@ bool Builder::Build(string* err) {
}
if (edge->is_phony()) {
- plan_.EdgeFinished(edge);
+ plan_.EdgeFinished(edge, true);
} else {
++pending_commands;
}
@@ -773,8 +778,10 @@ bool Builder::FinishCommand(CommandRunner::Result* result, string* err) {
&start_time, &end_time);
// The rest of this function only applies to successful commands.
- if (!result->success())
+ if (!result->success()) {
+ plan_.EdgeFinished(edge, false);
return true;
+ }
// Restat the edge outputs, if necessary.
TimeStamp restat_mtime = 0;
@@ -823,7 +830,7 @@ bool Builder::FinishCommand(CommandRunner::Result* result, string* err) {
}
}
- plan_.EdgeFinished(edge);
+ plan_.EdgeFinished(edge, true);
// Delete any left over response file.
string rspfile = edge->GetUnescapedRspfile();