diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc index bcef9807b..b7df98472 100644 --- a/src/libstore/build/derivation-goal.cc +++ b/src/libstore/build/derivation-goal.cc @@ -648,8 +648,7 @@ Goal::WorkResult DerivationGoal::inputsRealised() slot to become available, since we don't need one if there is a build hook. */ state = &DerivationGoal::tryToBuild; - worker.wakeUp(shared_from_this()); - return StillAlive{}; + return ContinueImmediately{}; } Goal::WorkResult DerivationGoal::started() @@ -763,8 +762,7 @@ Goal::WorkResult DerivationGoal::tryToBuild() actLock.reset(); state = &DerivationGoal::tryLocalBuild; - worker.wakeUp(shared_from_this()); - return StillAlive{}; + return ContinueImmediately{}; } Goal::WorkResult DerivationGoal::tryLocalBuild() { diff --git a/src/libstore/build/goal.hh b/src/libstore/build/goal.hh index f41fbea2f..3d487f6da 100644 --- a/src/libstore/build/goal.hh +++ b/src/libstore/build/goal.hh @@ -108,12 +108,14 @@ public: struct [[nodiscard]] StillAlive {}; struct [[nodiscard]] WaitForSlot {}; struct [[nodiscard]] WaitForAWhile {}; + struct [[nodiscard]] ContinueImmediately {}; struct [[nodiscard]] Finished { ExitCode result; std::unique_ptr ex; }; - struct [[nodiscard]] WorkResult : std::variant + struct [[nodiscard]] WorkResult + : std::variant { WorkResult() = delete; using variant::variant; diff --git a/src/libstore/build/substitution-goal.cc b/src/libstore/build/substitution-goal.cc index 192ddc572..77b003612 100644 --- a/src/libstore/build/substitution-goal.cc +++ b/src/libstore/build/substitution-goal.cc @@ -181,8 +181,7 @@ Goal::WorkResult PathSubstitutionGoal::referencesValid() assert(worker.store.isValidPath(i)); state = &PathSubstitutionGoal::tryToRun; - worker.wakeUp(shared_from_this()); - return StillAlive{}; + return ContinueImmediately{}; } @@ -255,8 +254,7 @@ Goal::WorkResult PathSubstitutionGoal::finished() /* Try the next substitute. */ state = &PathSubstitutionGoal::tryNext; - worker.wakeUp(shared_from_this()); - return StillAlive{}; + return ContinueImmediately{}; } worker.markContentsGood(storePath); diff --git a/src/libstore/build/worker.cc b/src/libstore/build/worker.cc index 722956e0d..32ac27483 100644 --- a/src/libstore/build/worker.cc +++ b/src/libstore/build/worker.cc @@ -189,6 +189,7 @@ void Worker::handleWorkResult(GoalPtr goal, Goal::WorkResult how) [&](Goal::StillAlive) {}, [&](Goal::WaitForSlot) { waitForBuildSlot(goal); }, [&](Goal::WaitForAWhile) { waitForAWhile(goal); }, + [&](Goal::ContinueImmediately) { wakeUp(goal); }, [&](Goal::Finished & f) { goalFinished(goal, f); }, }, how @@ -523,7 +524,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) diff --git a/src/libstore/build/worker.hh b/src/libstore/build/worker.hh index 3644039fb..20aa34e74 100644 --- a/src/libstore/build/worker.hh +++ b/src/libstore/build/worker.hh @@ -122,6 +122,11 @@ private: */ void waitForAWhile(GoalPtr goal); + /** + * Wake up a goal (i.e., there is something for it to do). + */ + void wakeUp(GoalPtr goal); + public: const Activity act; @@ -219,11 +224,6 @@ public: */ void removeGoal(GoalPtr goal); - /** - * Wake up a goal (i.e., there is something for it to do). - */ - void wakeUp(GoalPtr goal); - /** * Return the number of local build processes currently running (but not * remote builds via the build hook).