Github   Telegram
Loading...
Searching...
No Matches
async.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <functional>
7#include <string>
8#include <utility>
9
13
14USERVER_NAMESPACE_BEGIN
15
16namespace utils {
17
18namespace impl {
19
20// A wrapper that obtains a Span from args, attaches it to current coroutine,
21// and applies a function to the rest of arguments.
22struct SpanWrapCall {
23 enum class InheritVariables { kYes, kNo };
24
25 explicit SpanWrapCall(std::string&& name, InheritVariables inherit_variables);
26
27 SpanWrapCall(const SpanWrapCall&) = delete;
28 SpanWrapCall(SpanWrapCall&&) = delete;
29 SpanWrapCall& operator=(const SpanWrapCall&) = delete;
30 SpanWrapCall& operator=(SpanWrapCall&&) = delete;
31 ~SpanWrapCall();
32
33 template <typename Function, typename... Args>
34 auto operator()(Function&& f, Args&&... args) {
35 DoBeforeInvoke();
36 return std::invoke(std::forward<Function>(f), std::forward<Args>(args)...);
37 }
38
39 private:
40 void DoBeforeInvoke();
41
42 struct Impl;
43
44 static constexpr std::size_t kImplSize = 4240;
45 static constexpr std::size_t kImplAlign = 8;
47};
48
49// Note: 'name' must outlive the result of this function
50inline auto SpanLazyPrvalue(std::string&& name) {
51 return utils::LazyPrvalue([&name] {
52 return SpanWrapCall(std::move(name), SpanWrapCall::InheritVariables::kYes);
53 });
54}
55
56} // namespace impl
57
74template <typename Function, typename... Args>
75[[nodiscard]] auto CriticalAsync(engine::TaskProcessor& task_processor,
76 std::string name, Function&& f,
77 Args&&... args) {
79 task_processor, impl::SpanLazyPrvalue(std::move(name)),
80 std::forward<Function>(f), std::forward<Args>(args)...);
81}
82
100template <typename Function, typename... Args>
101[[nodiscard]] auto SharedCriticalAsync(engine::TaskProcessor& task_processor,
102 std::string name, Function&& f,
103 Args&&... args) {
105 task_processor, impl::SpanLazyPrvalue(std::move(name)),
106 std::forward<Function>(f), std::forward<Args>(args)...);
107}
108
126template <typename Function, typename... Args>
127[[nodiscard]] auto Async(engine::TaskProcessor& task_processor,
128 std::string name, Function&& f, Args&&... args) {
129 return engine::AsyncNoSpan(
130 task_processor, impl::SpanLazyPrvalue(std::move(name)),
131 std::forward<Function>(f), std::forward<Args>(args)...);
132}
133
152template <typename Function, typename... Args>
153[[nodiscard]] auto SharedAsync(engine::TaskProcessor& task_processor,
154 std::string name, Function&& f, Args&&... args) {
156 task_processor, impl::SpanLazyPrvalue(std::move(name)),
157 std::forward<Function>(f), std::forward<Args>(args)...);
158}
159
174template <typename Function, typename... Args>
175[[nodiscard]] auto Async(engine::TaskProcessor& task_processor,
176 std::string name, engine::Deadline deadline,
177 Function&& f, Args&&... args) {
178 return engine::AsyncNoSpan(
179 task_processor, deadline, impl::SpanLazyPrvalue(std::move(name)),
180 std::forward<Function>(f), std::forward<Args>(args)...);
181}
182
198template <typename Function, typename... Args>
199[[nodiscard]] auto SharedAsync(engine::TaskProcessor& task_processor,
200 std::string name, engine::Deadline deadline,
201 Function&& f, Args&&... args) {
203 task_processor, deadline, impl::SpanLazyPrvalue(std::move(name)),
204 std::forward<Function>(f), std::forward<Args>(args)...);
205}
206
223template <typename Function, typename... Args>
224[[nodiscard]] auto CriticalAsync(std::string name, Function&& f,
225 Args&&... args) {
226 return utils::CriticalAsync(engine::current_task::GetTaskProcessor(),
227 std::move(name), std::forward<Function>(f),
228 std::forward<Args>(args)...);
229}
230
248template <typename Function, typename... Args>
249[[nodiscard]] auto SharedCriticalAsync(std::string name, Function&& f,
250 Args&&... args) {
251 return utils::SharedCriticalAsync(engine::current_task::GetTaskProcessor(),
252 std::move(name), std::forward<Function>(f),
253 std::forward<Args>(args)...);
254}
255
273template <typename Function, typename... Args>
274[[nodiscard]] auto Async(std::string name, Function&& f, Args&&... args) {
275 return utils::Async(engine::current_task::GetTaskProcessor(), std::move(name),
276 std::forward<Function>(f), std::forward<Args>(args)...);
277}
278
297template <typename Function, typename... Args>
298[[nodiscard]] auto SharedAsync(std::string name, Function&& f, Args&&... args) {
299 return utils::SharedAsync(engine::current_task::GetTaskProcessor(),
300 std::move(name), std::forward<Function>(f),
301 std::forward<Args>(args)...);
302}
303
318template <typename Function, typename... Args>
319[[nodiscard]] auto Async(std::string name, engine::Deadline deadline,
320 Function&& f, Args&&... args) {
321 return utils::Async(engine::current_task::GetTaskProcessor(), std::move(name),
322 deadline, std::forward<Function>(f),
323 std::forward<Args>(args)...);
324}
325
341template <typename Function, typename... Args>
342[[nodiscard]] auto SharedAsync(std::string name, engine::Deadline deadline,
343 Function&& f, Args&&... args) {
344 return utils::SharedAsync(
345 engine::current_task::GetTaskProcessor(), std::move(name), deadline,
346 std::forward<Function>(f), std::forward<Args>(args)...);
347}
348
379template <typename Function, typename... Args>
380[[nodiscard]] auto AsyncBackground(std::string name,
381 engine::TaskProcessor& task_processor,
382 Function&& f, Args&&... args) {
383 return engine::AsyncNoSpan(
384 task_processor, utils::LazyPrvalue([&] {
385 return impl::SpanWrapCall(std::move(name),
386 impl::SpanWrapCall::InheritVariables::kNo);
387 }),
388 std::forward<Function>(f), std::forward<Args>(args)...);
389}
390
391} // namespace utils
392
393USERVER_NAMESPACE_END