diff options
Diffstat (limited to 'src/libstore/build/worker.cc')
-rw-r--r-- | src/libstore/build/worker.cc | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/libstore/build/worker.cc b/src/libstore/build/worker.cc index 135cfecf5..aaa4e8907 100644 --- a/src/libstore/build/worker.cc +++ b/src/libstore/build/worker.cc @@ -21,10 +21,6 @@ Worker::Worker(Store & store, Store & evalStore) nrLocalBuilds = 0; nrSubstitutions = 0; lastWokenUp = steady_time_point::min(); - permanentFailure = false; - timedOut = false; - hashMismatch = false; - checkMismatch = false; } @@ -145,6 +141,11 @@ void Worker::goalFinished(GoalPtr goal, Goal::Finished & f) assert(!goal->exitCode.has_value()); goal->exitCode = f.result; + permanentFailure |= f.permanentFailure; + timedOut |= f.timedOut; + hashMismatch |= f.hashMismatch; + checkMismatch |= f.checkMismatch; + if (f.ex) { if (!goal->waiters.empty()) logError(f.ex->info()); @@ -187,6 +188,15 @@ void Worker::handleWorkResult(GoalPtr goal, Goal::WorkResult how) std::visit( overloaded{ [&](Goal::StillAlive) {}, + [&](Goal::WaitForSlot) { waitForBuildSlot(goal); }, + [&](Goal::WaitForAWhile) { waitForAWhile(goal); }, + [&](Goal::ContinueImmediately) { wakeUp(goal); }, + [&](Goal::WaitForGoals & w) { + for (auto & dep : w.goals) { + goal->waitees.insert(dep); + dep->waiters.insert(goal); + } + }, [&](Goal::Finished & f) { goalFinished(goal, f); }, }, how @@ -521,7 +531,7 @@ void Worker::waitForInput() if (rd == 0 || (rd == -1 && errno == EIO)) { debug("%1%: got EOF", goal->getName()); goal->handleEOF(k); - wakeUp(goal); + handleWorkResult(goal, Goal::ContinueImmediately{}); j->fds.erase(k); } else if (rd == -1) { if (errno != EINTR) |