| // Copyright 2023 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef QUICHE_QUIC_TOOLS_QUIC_EVENT_LOOP_TOOLS_H_ | |
| #define QUICHE_QUIC_TOOLS_QUIC_EVENT_LOOP_TOOLS_H_ | |
| #include "absl/base/attributes.h" | |
| #include "quiche/quic/core/io/quic_event_loop.h" | |
| #include "quiche/quic/core/quic_clock.h" | |
| #include "quiche/quic/core/quic_time.h" | |
| #include "quiche/common/quiche_callbacks.h" | |
| namespace quic { | |
| inline constexpr QuicTimeDelta kDefaultTimeoutForTools = | |
| QuicTimeDelta::FromSeconds(3); | |
| inline constexpr QuicTimeDelta kDefaultEventLoopTimeoutForTools = | |
| QuicTimeDelta::FromMilliseconds(50); | |
| // Runs the event loop until the specified callback returns true, or until the | |
| // timeout occurs. Returns true if callback returned true at least once. | |
| ABSL_MUST_USE_RESULT inline bool ProcessEventsUntil( | |
| QuicEventLoop* event_loop, quiche::UnretainedCallback<bool()> callback, | |
| QuicTimeDelta timeout = kDefaultTimeoutForTools) { | |
| const QuicClock* clock = event_loop->GetClock(); | |
| QuicTime start = clock->Now(); | |
| while (!callback()) { | |
| event_loop->RunEventLoopOnce(kDefaultEventLoopTimeoutForTools); | |
| QuicTimeDelta elapsed = clock->Now() - start; | |
| if (elapsed >= timeout) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_TOOLS_QUIC_EVENT_LOOP_TOOLS_H_ |