2#include "nix/store/build/goal.hh"
3#include "nix/store/build/worker.hh"
8auto Goal::promise_type::await_transform(AsyncCallback<T> && ac)
12 fun<void(Callback<T>)> fn;
13 std::shared_ptr<std::promise<T>> promise;
20 void await_suspend(handle_type h)
22 auto goal = h.promise().goal;
23 promise = std::make_shared<std::promise<T>>();
25 fn(Callback<T>([promise = promise,
26 maybeWaker = goal->worker.getCrossThreadWaker(),
27 goalWeak = goal->weak_from_this()](std::future<T> res) {
29 promise->set_value(res.get());
31 promise->set_exception(std::current_exception());
36 if (
auto waker = maybeWaker.lock())
37 waker->enqueue(goalWeak);
40 goal->worker.waitForCompletion(goal->shared_from_this());
45 return promise->get_future().get();
49 return Awaiter{.fn = std::move(ac.fn)};