10#include <userver/engine/async.hpp>
11#include <userver/utils/fast_pimpl.hpp>
12#include <userver/utils/lazy_prvalue.hpp>
14USERVER_NAMESPACE_BEGIN
23 enum class InheritVariables { kYes, kNo };
25 explicit SpanWrapCall(std::string&& name, InheritVariables inherit_variables,
const SourceLocation& location);
27 SpanWrapCall(
const SpanWrapCall&) =
delete;
28 SpanWrapCall(SpanWrapCall&&) =
delete;
29 SpanWrapCall& operator=(
const SpanWrapCall&) =
delete;
30 SpanWrapCall& operator=(SpanWrapCall&&) =
delete;
33 template <
typename Function,
typename... Args>
34 auto operator()(Function&& f, Args&&... args) {
36 return std::invoke(std::forward<Function>(f), std::forward<Args>(args)...);
40 void DoBeforeInvoke();
44 static constexpr std::size_t kImplSize = 4432;
45 static constexpr std::size_t kImplAlign = 8;
46 utils::FastPimpl<Impl, kImplSize, kImplAlign> pimpl_;
50inline auto SpanLazyPrvalue(
52 SpanWrapCall::InheritVariables inherit_variables = SpanWrapCall::InheritVariables::kYes,
53 const SourceLocation& location = SourceLocation::Current()
55 return utils::LazyPrvalue([&name, inherit_variables, &location] {
56 return SpanWrapCall(std::move(name), inherit_variables, location);
94template <
typename Function,
typename... Args>
95[[nodiscard]]
auto Async(std::string name, Function&& f, Args&&... args) {
96 return engine::AsyncNoSpan(
98 impl::SpanLazyPrvalue(std::move(name)),
99 std::forward<Function>(f),
100 std::forward<Args>(args)...
95[[nodiscard]]
auto Async(std::string name, Function&& f, Args&&... args) {
…}
115template <
typename Function,
typename... Args>
116[[nodiscard]]
auto Async(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
117 return engine::AsyncNoSpan(
118 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
116[[nodiscard]]
auto Async(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
…}
133template <
typename Function,
typename... Args>
135CriticalAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
136 return engine::CriticalAsyncNoSpan(
137 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
135CriticalAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
…}
152template <
typename Function,
typename... Args>
154SharedCriticalAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
155 return engine::SharedCriticalAsyncNoSpan(
156 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
171template <
typename Function,
typename... Args>
172[[nodiscard]]
auto SharedAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
173 return engine::SharedAsyncNoSpan(
174 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
172[[nodiscard]]
auto SharedAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
…}
190template <
typename Function,
typename... Args>
192 engine::TaskProcessor& task_processor,
194 engine::Deadline deadline,
198 return engine::AsyncNoSpan(
201 impl::SpanLazyPrvalue(std::move(name)),
202 std::forward<Function>(f),
203 std::forward<Args>(args)...
219template <
typename Function,
typename... Args>
221 engine::TaskProcessor& task_processor,
223 engine::Deadline deadline,
227 return engine::SharedAsyncNoSpan(
230 impl::SpanLazyPrvalue(std::move(name)),
231 std::forward<Function>(f),
232 std::forward<Args>(args)...
246template <
typename Function,
typename... Args>
247[[nodiscard]]
auto CriticalAsync(std::string name, Function&& f, Args&&... args) {
248 return utils::CriticalAsync(
251 std::forward<Function>(f),
252 std::forward<Args>(args)...
247[[nodiscard]]
auto CriticalAsync(std::string name, Function&& f, Args&&... args) {
…}
266template <
typename Function,
typename... Args>
268 return utils::SharedCriticalAsync(
271 std::forward<Function>(f),
272 std::forward<Args>(args)...
286template <
typename Function,
typename... Args>
287[[nodiscard]]
auto SharedAsync(std::string name, Function&& f, Args&&... args) {
288 return utils::SharedAsync(
291 std::forward<Function>(f),
292 std::forward<Args>(args)...
287[[nodiscard]]
auto SharedAsync(std::string name, Function&& f, Args&&... args) {
…}
307template <
typename Function,
typename... Args>
308[[nodiscard]]
auto Async(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
313 std::forward<Function>(f),
314 std::forward<Args>(args)...
308[[nodiscard]]
auto Async(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
…}
329template <
typename Function,
typename... Args>
330[[nodiscard]]
auto SharedAsync(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
331 return utils::SharedAsync(
335 std::forward<Function>(f),
336 std::forward<Args>(args)...
330[[nodiscard]]
auto SharedAsync(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
…}
370template <
typename Function,
typename... Args>
372AsyncBackground(std::string name, engine::TaskProcessor& task_processor, Function&& f, Args&&... args) {
373 return engine::AsyncNoSpan(
375 impl::SpanLazyPrvalue(std::move(name), impl::SpanWrapCall::InheritVariables::kNo),
376 std::forward<Function>(f),
377 std::forward<Args>(args)...
372AsyncBackground(std::string name, engine::TaskProcessor& task_processor, Function&& f, Args&&... args) {
…}
394template <
typename Function,
typename... Args>
397 return engine::CriticalAsyncNoSpan(
399 impl::SpanLazyPrvalue(std::move(name), impl::SpanWrapCall::InheritVariables::kNo),
400 std::forward<Function>(f),
401 std::forward<Args>(args)...