Github   Telegram
Loading...
Searching...
No Matches
wait_all_checked.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <chrono>
7#include <vector>
8
11#include <userver/utils/impl/span.hpp>
13
14USERVER_NAMESPACE_BEGIN
15
16namespace engine {
17
43template <typename... Tasks>
44void WaitAllChecked(Tasks&... tasks);
45
49template <typename... Tasks, typename Rep, typename Period>
50[[nodiscard]] FutureStatus WaitAllCheckedFor(
51 const std::chrono::duration<Rep, Period>& duration, Tasks&... tasks);
52
56template <typename... Tasks, typename Clock, typename Duration>
57[[nodiscard]] FutureStatus WaitAllCheckedUntil(
58 const std::chrono::time_point<Clock, Duration>& until, Tasks&... tasks);
59
63template <typename... Tasks>
64[[nodiscard]] FutureStatus WaitAllCheckedUntil(Deadline deadline,
65 Tasks&... tasks);
66
67namespace impl {
68
69class ContextAccessor;
70
71FutureStatus DoWaitAllChecked(utils::impl::Span<ContextAccessor*> targets,
72 Deadline deadline);
73
74template <typename Container>
75FutureStatus WaitAllCheckedFromContainer(Deadline deadline, Container& tasks) {
76 std::vector<ContextAccessor*> targets;
77 targets.reserve(std::size(tasks));
78
79 for (auto& task : tasks) {
80 targets.push_back(task.TryGetContextAccessor());
81 }
82
83 return impl::DoWaitAllChecked(targets, deadline);
84}
85
86template <typename... Tasks>
87FutureStatus WaitAllCheckedFromTasks(Deadline deadline, Tasks&... tasks) {
88 ContextAccessor* targets[]{tasks.TryGetContextAccessor()...};
89 return impl::DoWaitAllChecked(targets, deadline);
90}
91
92inline FutureStatus WaitAllCheckedFromTasks(Deadline /*deadline*/) {
94}
95
96void HandleWaitAllStatus(FutureStatus status);
97
98} // namespace impl
99
100template <typename... Tasks>
101void WaitAllChecked(Tasks&... tasks) {
102 impl::HandleWaitAllStatus(engine::WaitAllCheckedUntil(Deadline{}, tasks...));
103}
104
105template <typename... Tasks, typename Rep, typename Period>
106[[nodiscard]] FutureStatus WaitAllCheckedFor(
107 const std::chrono::duration<Rep, Period>& duration, Tasks&... tasks) {
108 return WaitAllCheckedUntil(Deadline::FromDuration(duration), tasks...);
109}
110
111template <typename... Tasks, typename Clock, typename Duration>
112[[nodiscard]] FutureStatus WaitAllCheckedUntil(
113 const std::chrono::time_point<Clock, Duration>& until, Tasks&... tasks) {
114 return WaitAllCheckedUntil(Deadline::FromTimePoint(until), tasks...);
115}
116
117template <typename... Tasks>
118[[nodiscard]] FutureStatus WaitAllCheckedUntil(Deadline deadline,
119 Tasks&... tasks) {
120 if constexpr (meta::impl::IsSingleRange<Tasks...>()) {
121 return impl::WaitAllCheckedFromContainer(deadline, tasks...);
122 } else {
123 return impl::WaitAllCheckedFromTasks(deadline, tasks...);
124 }
125}
126
127} // namespace engine
128
129USERVER_NAMESPACE_END