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