133        Changes_.emplace_back(
TEvent{fd, TEvent::READ|TEvent::WRITE|TEvent::RHUP, {}});
 
 
  156        struct TAwaitableSleep {
 
  167            TAwaitableSleep(TAwaitableSleep&& other)
 
  168                : poller(other.poller)
 
  171                other.poller = 
nullptr;
 
  174            TAwaitableSleep(
const TAwaitableSleep&) = 
delete;
 
  175            TAwaitableSleep& operator=(
const TAwaitableSleep&) = 
delete;
 
  181            void await_suspend(std::coroutine_handle<> h) {
 
  185            void await_resume() { poller = 
nullptr; }
 
  189            unsigned timerId = 0;
 
  192        return TAwaitableSleep{
this,until};
 
 
  202    template<
typename Rep, 
typename Period>
 
  203    auto Sleep(std::chrono::duration<Rep,Period> duration) {
 
  204        return Sleep(TClock::now() + duration);
 
 
  214        return Sleep(TTime{});
 
 
  244        change.Handle.resume();
 
  245        if (change.Fd >= 0) {
 
  246            bool matched = 
false;
 
  247            for (; index < 
Changes_.size() && !matched; index++) {
 
  248                matched = 
Changes_[index].Match(change);
 
  252                Changes_.emplace_back(std::move(change));
 
 
  289            : 
Timers_.top().Deadline == TTime{}
 
 
  300        auto p1 = std::chrono::duration_cast<std::chrono::seconds>(duration);
 
  301        auto p2 = std::chrono::duration_cast<std::chrono::nanoseconds>(duration - p1);
 
  303        ts.tv_sec = p1.count();
 
  304        ts.tv_nsec = p2.count();
 
 
  320        auto now = TClock::now();
 
  327            if ((first || prevId != timer.Id) && timer.Handle) { 
 
  329                timer.Handle.resume();
 
 
  346    std::chrono::milliseconds 
MaxDuration_ = std::chrono::milliseconds(100); 
 
 
Base class for pollers managing asynchronous I/O events and timers.
Definition poller.hpp:52
timespec GetTimeout() const
Computes the poll timeout based on scheduled timers.
Definition poller.hpp:286
void AddRemoteHup(int fd, THandle h)
Registers a remote hang-up (RHUP) event.
Definition poller.hpp:119
TPollerBase()=default
Default constructor.
std::chrono::milliseconds MaxDuration_
Maximum poll duration.
Definition poller.hpp:346
TPollerBase(const TPollerBase &)=delete
Copying is disabled.
void Wakeup(TEvent &&change)
Wakes up a coroutine waiting on an event.
Definition poller.hpp:225
void Reset()
Clears the lists of ready events and pending changes.
Definition poller.hpp:308
void SetMaxDuration(std::chrono::milliseconds maxDuration)
Sets the maximum polling duration.
Definition poller.hpp:271
void ProcessTimers()
Processes scheduled timers.
Definition poller.hpp:319
unsigned LastFiredTimer_
ID of the last fired timer.
Definition poller.hpp:345
unsigned AddTimer(TTime deadline, THandle h)
Schedules a timer.
Definition poller.hpp:70
std::vector< TEvent > ReadyEvents_
Events ready to wake up their coroutines.
Definition poller.hpp:341
void AddWrite(int fd, THandle h)
Registers a write event on a file descriptor.
Definition poller.hpp:109
int MaxFd_
Highest file descriptor in use.
Definition poller.hpp:339
auto Sleep(TTime until)
Suspends execution until the specified time.
Definition poller.hpp:155
std::priority_queue< TTimer > Timers_
Priority queue for scheduled timers.
Definition poller.hpp:343
timespec MaxDurationTs_
Max duration represented as timespec.
Definition poller.hpp:347
bool RemoveTimer(unsigned timerId, TTime deadline)
Removes or cancels a timer.
Definition poller.hpp:85
auto TimersSize() const
Returns the number of scheduled timers.
Definition poller.hpp:276
void RemoveEvent(int fd)
Removes registered events for a specific file descriptor.
Definition poller.hpp:130
void AddRead(int fd, THandle h)
Registers a read event on a file descriptor.
Definition poller.hpp:99
void RemoveEvent(THandle)
Removes events associated with a given coroutine handle.
Definition poller.hpp:143
TTime LastTimersProcessTime_
Last time timers were processed.
Definition poller.hpp:344
std::vector< TEvent > Changes_
Pending changes (registered events).
Definition poller.hpp:340
static constexpr timespec GetMaxDuration(std::chrono::milliseconds duration)
Computes a timespec from a duration.
Definition poller.hpp:299
unsigned TimerId_
Counter for generating unique timer IDs.
Definition poller.hpp:342
auto Yield()
Yields execution to the next event loop iteration.
Definition poller.hpp:213
void WakeupReadyHandles()
Wakes up all coroutines waiting on ready events.
Definition poller.hpp:261
auto Sleep(std::chrono::duration< Rep, Period > duration)
Overload of Sleep() accepting a duration.
Definition poller.hpp:203