6#include <boost/intrusive_ptr.hpp>
7#include <boost/smart_ptr/intrusive_ref_counter.hpp>
9#include <userver/engine/deadline.hpp>
10#include <userver/engine/exception.hpp>
11#include <userver/engine/future_status.hpp>
12#include <userver/engine/single_consumer_event.hpp>
13#include <userver/engine/task/cancel.hpp>
14#include <userver/utils/make_intrusive_ptr.hpp>
16USERVER_NAMESPACE_BEGIN
31template <
typename SubscribableFuture>
39template <
typename SubscribableFuture>
41 SubscribableFuture&& future, engine::Deadline deadline);
45struct EventHolder
final : boost::intrusive_ref_counter<EventHolder> {
46 engine::SingleConsumerEvent event{engine::SingleConsumerEvent::NoAutoReset{}};
51template <
typename SubscribableFuture>
53 if (
drivers::TryWaitForSubscribableFuture(future, engine
::Deadline
{}) !=
60template <
typename SubscribableFuture>
62 SubscribableFuture&& future, engine::Deadline deadline) {
63 auto event_holder = utils::make_intrusive_ptr<impl::EventHolder>();
64 future.Subscribe([event_holder](
auto&) { event_holder->event.Send(); });
65 if (event_holder->event.WaitForEventUntil(deadline)) {