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);
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 = 4280;
45 static constexpr std::size_t kImplAlign = 8;
46 utils::FastPimpl<Impl, kImplSize, kImplAlign> pimpl_;
50inline auto SpanLazyPrvalue(std::string&& name) {
51 return utils::LazyPrvalue([&name] {
return SpanWrapCall(std::move(name), SpanWrapCall::InheritVariables::kYes); });
88template <
typename Function,
typename... Args>
89[[nodiscard]]
auto Async(std::string name, Function&& f, Args&&... args) {
90 return engine::AsyncNoSpan(
92 impl::SpanLazyPrvalue(std::move(name)),
93 std::forward<Function>(f),
94 std::forward<Args>(args)...
89[[nodiscard]]
auto Async(std::string name, Function&& f, Args&&... args) {
…}
109template <
typename Function,
typename... Args>
110[[nodiscard]]
auto Async(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
111 return engine::AsyncNoSpan(
112 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
110[[nodiscard]]
auto Async(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
…}
127template <
typename Function,
typename... Args>
129CriticalAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
130 return engine::CriticalAsyncNoSpan(
131 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
129CriticalAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
…}
146template <
typename Function,
typename... Args>
148SharedCriticalAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
149 return engine::SharedCriticalAsyncNoSpan(
150 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
165template <
typename Function,
typename... Args>
166[[nodiscard]]
auto SharedAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
167 return engine::SharedAsyncNoSpan(
168 task_processor, impl::SpanLazyPrvalue(std::move(name)), std::forward<Function>(f), std::forward<Args>(args)...
166[[nodiscard]]
auto SharedAsync(engine::TaskProcessor& task_processor, std::string name, Function&& f, Args&&... args) {
…}
184template <
typename Function,
typename... Args>
186 engine::TaskProcessor& task_processor,
188 engine::Deadline deadline,
192 return engine::AsyncNoSpan(
195 impl::SpanLazyPrvalue(std::move(name)),
196 std::forward<Function>(f),
197 std::forward<Args>(args)...
213template <
typename Function,
typename... Args>
215 engine::TaskProcessor& task_processor,
217 engine::Deadline deadline,
221 return engine::SharedAsyncNoSpan(
224 impl::SpanLazyPrvalue(std::move(name)),
225 std::forward<Function>(f),
226 std::forward<Args>(args)...
240template <
typename Function,
typename... Args>
241[[nodiscard]]
auto CriticalAsync(std::string name, Function&& f, Args&&... args) {
242 return utils::CriticalAsync(
245 std::forward<Function>(f),
246 std::forward<Args>(args)...
241[[nodiscard]]
auto CriticalAsync(std::string name, Function&& f, Args&&... args) {
…}
260template <
typename Function,
typename... Args>
262 return utils::SharedCriticalAsync(
265 std::forward<Function>(f),
266 std::forward<Args>(args)...
280template <
typename Function,
typename... Args>
281[[nodiscard]]
auto SharedAsync(std::string name, Function&& f, Args&&... args) {
282 return utils::SharedAsync(
285 std::forward<Function>(f),
286 std::forward<Args>(args)...
281[[nodiscard]]
auto SharedAsync(std::string name, Function&& f, Args&&... args) {
…}
301template <
typename Function,
typename... Args>
302[[nodiscard]]
auto Async(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
307 std::forward<Function>(f),
308 std::forward<Args>(args)...
302[[nodiscard]]
auto Async(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
…}
323template <
typename Function,
typename... Args>
324[[nodiscard]]
auto SharedAsync(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
325 return utils::SharedAsync(
329 std::forward<Function>(f),
330 std::forward<Args>(args)...
324[[nodiscard]]
auto SharedAsync(std::string name, engine::Deadline deadline, Function&& f, Args&&... args) {
…}
364template <
typename Function,
typename... Args>
366AsyncBackground(std::string name, engine::TaskProcessor& task_processor, Function&& f, Args&&... args) {
367 return engine::AsyncNoSpan(
369 utils::LazyPrvalue([&] {
370 return impl::SpanWrapCall(std::move(name), impl::SpanWrapCall::InheritVariables::kNo);
372 std::forward<Function>(f),
373 std::forward<Args>(args)...
366AsyncBackground(std::string name, engine::TaskProcessor& task_processor, Function&& f, Args&&... args) {
…}
390template <
typename Function,
typename... Args>
393 return engine::CriticalAsyncNoSpan(
395 utils::LazyPrvalue([&] {
396 return impl::SpanWrapCall(std::move(name), impl::SpanWrapCall::InheritVariables::kNo);
398 std::forward<Function>(f),
399 std::forward<Args>(args)...