1414ASYNCIO_NS_BEGIN
1515namespace detail {
1616template <typename R, typename Duration>
17- struct WaitForAwaiter {
17+ struct WaitForAwaiter : NonCopyable {
1818 constexpr bool await_ready () noexcept { return false ; }
1919 constexpr decltype (auto ) await_resume() {
2020 return result_.result ();
@@ -60,16 +60,12 @@ struct WaitForAwaiter {
6060 EventLoop& loop{get_event_loop ()};
6161 loop.call_later (timeout, *this );
6262 }
63- void run () override { // timeout!
63+ void run () final { // timeout!
6464 EventLoop& loop{get_event_loop ()};
6565 loop.cancel_handle (current_task_);
6666 awaiter_.result_ .set_exception (std::make_exception_ptr (TimeoutError{}));
6767 loop.call_soon (*awaiter_.continuation_ );
6868 }
69- const HandleFrameInfo& get_frame_info () override {
70- static HandleFrameInfo frame_info;
71- return frame_info;
72- }
7369
7470 WaitForAwaiter& awaiter_;
7571 Handle& current_task_;
@@ -79,11 +75,27 @@ struct WaitForAwaiter {
7975template <concepts::Awaitable Fut, typename Duration>
8076WaitForAwaiter (Fut&&, Duration) -> WaitForAwaiter<AwaitResult<Fut>, Duration>;
8177
78+ template <concepts::Awaitable Fut, typename Duration>
79+ struct WaitForAwaiterRegistry {
80+ WaitForAwaiterRegistry (Fut&& fut, Duration duration)
81+ : fut_(std::forward<Fut>(fut)), duration_(duration) { }
82+
83+ auto operator co_await () && {
84+ return WaitForAwaiter{std::move (fut_), duration_};
85+ }
86+ private:
87+ Fut fut_; // lift Future's lifetime
88+ Duration duration_;
89+ };
90+
91+ template <concepts::Awaitable Fut, typename Duration>
92+ WaitForAwaiterRegistry (Fut&& fut, Duration duration)
93+ -> WaitForAwaiterRegistry<Fut, Duration>;
94+
8295template <concepts::Awaitable Fut, typename Rep, typename Period>
8396auto wait_for (NoWaitAtInitialSuspend, Fut&& fut, std::chrono::duration<Rep, Period> timeout)
8497-> Task<AwaitResult<Fut>> {
85- Fut future = std::forward<Fut>(fut); // lift fut lifetime
86- co_return co_await WaitForAwaiter { std::forward<Fut>(future), timeout };
98+ co_return co_await WaitForAwaiterRegistry { std::forward<Fut>(fut), timeout };
8799}
88100}
89101
0 commit comments