aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/derivation-goal.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-09-24 00:21:16 +0200
committereldritch horrors <pennae@lix.systems>2024-09-29 14:29:14 +0000
commit8fb642b6e09368d10d8357fcb7c508f706fa5f08 (patch)
tree8ddf9ab70729c40c2776a0f8a00eb305c79abfcb /src/libstore/build/derivation-goal.cc
parent1a52e4f755c3fcc50e58f7a0b04269a3839b7eea (diff)
libstore: remove Goal::WaitForWorld
have DerivationGoal and its subclasses produce a wrapper promise for their intermediate results instead, and return this wrapper promise. Worker already handles promises that do not complete immediately, so we do not have to duplicate this into an entire result type variant. Change-Id: Iae8dbf63cfc742afda4d415922a29ac5a3f39348
Diffstat (limited to 'src/libstore/build/derivation-goal.cc')
-rw-r--r--src/libstore/build/derivation-goal.cc15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc
index b8c4d278d..037b4fb10 100644
--- a/src/libstore/build/derivation-goal.cc
+++ b/src/libstore/build/derivation-goal.cc
@@ -787,7 +787,7 @@ try {
buildResult.startTime = time(0); // inexact
state = &DerivationGoal::buildDone;
started();
- return {{WaitForWorld{std::move(a.promise)}}};
+ return continueOrError(std::move(a.promise));
},
[&](HookReply::Postpone) -> std::optional<kj::Promise<Result<WorkResult>>> {
/* Not now; wait until at least one child finishes or
@@ -1756,4 +1756,17 @@ void DerivationGoal::waiteeDone(GoalPtr waitee)
}
}
+kj::Promise<Result<Goal::WorkResult>>
+DerivationGoal::continueOrError(kj::Promise<Outcome<void, Goal::Finished>> p)
+{
+ return p.then([](auto r) -> Result<WorkResult> {
+ if (r.has_value()) {
+ return ContinueImmediately{};
+ } else if (r.has_error()) {
+ return r.assume_error();
+ } else {
+ return r.assume_exception();
+ }
+ });
+}
}