uvco 0.1
Loading...
Searching...
No Matches
Threadpool

Classes

class  uvco::ThreadLocalKey< T >

Functions

Promise< void > uvco::innerSubmitWork (const Loop &loop, std::function< void()> work)
 Do not use; instead, use submitWork<void>().
template<typename R>
requires std::is_void_v<R> || std::is_move_constructible_v<R>
Promise< R > uvco::submitWork (const Loop &loop, std::function< R()> work)
template<>
Promise< void > uvco::submitWork (const Loop &loop, std::function< void()> work)

Detailed Description

Function Documentation

◆ innerSubmitWork()

Promise< void > uvco::innerSubmitWork ( const Loop & loop,
std::function< void()> work )

Do not use; instead, use submitWork<void>().

104 {
105 AsyncWorkAwaiter_ awaiter{std::move(work)};
106 uv_queue_work(loop.uvloop(), &awaiter.work(), AsyncWorkAwaiter_::onDoWork,
107 AsyncWorkAwaiter_::onWorkDone);
108 co_await awaiter;
109 co_return;
110}
uv_loop_t * uvloop() const
Get a non-owned pointer to the loop.
Definition loop.cc:83

◆ submitWork() [1/2]

template<typename R>
requires std::is_void_v<R> || std::is_move_constructible_v<R>
Promise< R > uvco::submitWork ( const Loop & loop,
std::function< R()> work )

Submit a function to be run on the libuv threadpool. The promise will return the function's return value.

27 {
28 std::optional<std::variant<R, std::exception_ptr>> result;
29 // Erase return type and use generic submitWork().
30 std::function<void()> agnosticWork = [&result, work]() {
31 try {
32 result = work();
33 } catch (...) {
34 result = std::current_exception();
35 }
36 };
37 co_await innerSubmitWork(loop, std::move(agnosticWork));
38 BOOST_ASSERT(result.has_value());
39 if (result->index() == 1) {
40 std::rethrow_exception(std::get<std::exception_ptr>(*result));
41 }
42 co_return std::get<R>(std::move(*result));
43}
Promise< void > innerSubmitWork(const Loop &loop, std::function< void()> work)
Do not use; instead, use submitWork<void>().
Definition async_work.cc:104

◆ submitWork() [2/2]

template<>
Promise< void > uvco::submitWork ( const Loop & loop,
std::function< void()> work )
113 {
114 std::optional<std::exception_ptr> result;
115 // Transport exception back to submitter.
116 std::function<void()> agnosticWork = [&result, work = std::move(work)]() {
117 try {
118 work();
119 } catch (...) {
120 result = std::current_exception();
121 }
122 };
123 co_await innerSubmitWork(loop, std::move(agnosticWork));
124 if (result.has_value()) {
125 std::rethrow_exception(result.value());
126 }
127 co_return;
128}