From c1085ce84926c08b371921d69cd692498071c4cc Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 13 May 2025 19:24:35 -0400 Subject: [PATCH] Get rid of virtual `Goal::init()` Now, each class provides the initial coroutine by value. This avoids some sketchy virtual function stuff, and will also be further put to good use in the next commit. --- src/libstore/build/derivation-goal.cc | 4 ++-- .../build/drv-output-substitution-goal.cc | 2 +- src/libstore/build/substitution-goal.cc | 2 +- .../nix/store/build/derivation-goal.hh | 2 +- .../build/drv-output-substitution-goal.hh | 2 +- src/libstore/include/nix/store/build/goal.hh | 19 ++----------------- .../nix/store/build/substitution-goal.hh | 2 +- 7 files changed, 9 insertions(+), 24 deletions(-) diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc index 393157938..48031ac3d 100644 --- a/src/libstore/build/derivation-goal.cc +++ b/src/libstore/build/derivation-goal.cc @@ -25,7 +25,7 @@ namespace nix { DerivationGoal::DerivationGoal(const StorePath & drvPath, const OutputsSpec & wantedOutputs, Worker & worker, BuildMode buildMode) - : Goal(worker) + : Goal(worker, init()) , useDerivation(true) , drvPath(drvPath) , wantedOutputs(wantedOutputs) @@ -43,7 +43,7 @@ DerivationGoal::DerivationGoal(const StorePath & drvPath, DerivationGoal::DerivationGoal(const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, Worker & worker, BuildMode buildMode) - : Goal(worker) + : Goal(worker, init()) , useDerivation(false) , drvPath(drvPath) , wantedOutputs(wantedOutputs) diff --git a/src/libstore/build/drv-output-substitution-goal.cc b/src/libstore/build/drv-output-substitution-goal.cc index 80a6e060e..e87a796f6 100644 --- a/src/libstore/build/drv-output-substitution-goal.cc +++ b/src/libstore/build/drv-output-substitution-goal.cc @@ -12,7 +12,7 @@ DrvOutputSubstitutionGoal::DrvOutputSubstitutionGoal( Worker & worker, RepairFlag repair, std::optional ca) - : Goal(worker) + : Goal(worker, init()) , id(id) { name = fmt("substitution of '%s'", id.to_string()); diff --git a/src/libstore/build/substitution-goal.cc b/src/libstore/build/substitution-goal.cc index b745548a1..9ffc8219d 100644 --- a/src/libstore/build/substitution-goal.cc +++ b/src/libstore/build/substitution-goal.cc @@ -9,7 +9,7 @@ namespace nix { PathSubstitutionGoal::PathSubstitutionGoal(const StorePath & storePath, Worker & worker, RepairFlag repair, std::optional ca) - : Goal(worker) + : Goal(worker, init()) , storePath(storePath) , repair(repair) , ca(ca) diff --git a/src/libstore/include/nix/store/build/derivation-goal.hh b/src/libstore/include/nix/store/build/derivation-goal.hh index f6f4da249..4cfeb5925 100644 --- a/src/libstore/include/nix/store/build/derivation-goal.hh +++ b/src/libstore/include/nix/store/build/derivation-goal.hh @@ -166,7 +166,7 @@ struct DerivationGoal : public Goal /** * The states. */ - Co init() override; + Co init(); Co haveDerivation(); Co gaveUpOnSubstitution(); Co tryToBuild(); diff --git a/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh b/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh index a00de41ad..0176f001a 100644 --- a/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh +++ b/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh @@ -33,7 +33,7 @@ public: typedef void (DrvOutputSubstitutionGoal::*GoalState)(); GoalState state; - Co init() override; + Co init(); Co realisationFetched(Goals waitees, std::shared_ptr outputInfo, nix::ref sub); void timedOut(Error && ex) override { unreachable(); }; diff --git a/src/libstore/include/nix/store/build/goal.hh b/src/libstore/include/nix/store/build/goal.hh index 399b5f82f..669b58e3e 100644 --- a/src/libstore/include/nix/store/build/goal.hh +++ b/src/libstore/include/nix/store/build/goal.hh @@ -338,17 +338,6 @@ protected: */ std::optional top_co; - /** - * The entry point for the goal - */ - virtual Co init() = 0; - - /** - * Wrapper around @ref init since virtual functions - * can't be used in constructors. - */ - inline Co init_wrapper(); - /** * Signals that the goal is done. * `co_return` the result. If you're not inside a coroutine, you can ignore @@ -376,8 +365,8 @@ public: */ std::optional ex; - Goal(Worker & worker) - : worker(worker), top_co(init_wrapper()) + Goal(Worker & worker, Co init) + : worker(worker), top_co(std::move(init)) { // top_co shouldn't have a goal already, should be nullptr. assert(!top_co->handle.promise().goal); @@ -440,7 +429,3 @@ template struct std::coroutine_traits { using promise_type = nix::Goal::promise_type; }; - -nix::Goal::Co nix::Goal::init_wrapper() { - co_return init(); -} diff --git a/src/libstore/include/nix/store/build/substitution-goal.hh b/src/libstore/include/nix/store/build/substitution-goal.hh index 7b68b0821..b61706840 100644 --- a/src/libstore/include/nix/store/build/substitution-goal.hh +++ b/src/libstore/include/nix/store/build/substitution-goal.hh @@ -64,7 +64,7 @@ public: /** * The states. */ - Co init() override; + Co init(); Co gotInfo(); Co tryToRun(StorePath subPath, nix::ref sub, std::shared_ptr info, bool & substituterFailed); Co finished();