uvco 0.1
Loading...
Searching...
No Matches
Classes | Functions
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>().

87 {
88 AsyncWorkAwaiter_ awaiter{work};
89 uv_queue_work(loop.uvloop(), &awaiter.work(), AsyncWorkAwaiter_::onDoWork,
90 AsyncWorkAwaiter_::onWorkDone);
91 co_await awaiter;
92 co_return;
93}

◆ 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, 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:87

◆ submitWork() [2/2]

template<>
Promise< void > uvco::submitWork ( const Loop loop,
std::function< void()>  work 
)
96 {
97 std::optional<std::exception_ptr> result;
98 // Erase return type and use generic submitWork().
99 std::function<void()> agnosticWork = [&result, work]() {
100 try {
101 work();
102 } catch (...) {
103 result = std::current_exception();
104 }
105 };
106 co_await innerSubmitWork(loop, agnosticWork);
107 if (result.has_value()) {
108 std::rethrow_exception(result.value());
109 }
110 co_return;
111}