5#include "lix/libutil/signals.hh"
7#include <kj/async-io.h>
14 static inline thread_local AsyncContext * current =
nullptr;
16 kj::AsyncIoProvider & provider;
17 kj::UnixEventPort & unixEventPort;
20 : provider(*aio.provider)
21 , unixEventPort(aio.unixEventPort)
23 assert(current ==
nullptr);
37 kj::AsyncIoContext kj;
40 AsyncIoRoot() : kj(kj::setupAsyncIo()), context(kj) {}
44 auto blockOn(kj::Promise<T> && promise);
49 assert(AsyncContext::current !=
nullptr);
50 return *AsyncContext::current;
54inline void materializeResult(Result<void> r)
60inline T materializeResult(Result<T> r)
62 return std::move(r.value());
71T runAsyncUnwrap(Result<T> t)
73 return std::move(t).value();
76auto runAsyncInNewThread(std::invocable<AsyncIoRoot &>
auto fn)
78 auto future = std::async(std::launch::async, [&] {
81 if constexpr (!std::is_void_v<
decltype(fn(aioRoot))>) {
82 return runAsyncUnwrap(fn(aioRoot));
92#define LIX_RUN_ASYNC_IN_NEW_THREAD(...) \
93 ::nix::detail::runAsyncInNewThread([&](AsyncIoRoot & AIOROOT) { \
94 return AIOROOT.blockOn(__VA_ARGS__); \
100#define LIX_TRY_AWAIT(...) (::nix::detail::materializeResult(co_await (__VA_ARGS__)))
102#if LIX_UR_COMPILER_UWU
103# define RUN_ASYNC_IN_NEW_THREAD LIX_RUN_ASYNC_IN_NEW_THREAD
104# define TRY_AWAIT LIX_TRY_AWAIT
108inline auto nix::AsyncIoRoot::blockOn(kj::Promise<T> && promise)
110 return detail::runAsyncUnwrap(promise.wait(kj.waitScope));