Poller implementation based on the poll() system call. More...
#include <poll.hpp>
Public Types | |
using | TSocket = NNet::TSocket |
Alias for the socket type. | |
using | TFileHandle = NNet::TFileHandle |
Alias for the file handle type. | |
Public Member Functions | |
void | Poll () |
Polls for I/O events. | |
![]() | |
TPollerBase ()=default | |
Default constructor. | |
TPollerBase (const TPollerBase &)=delete | |
Copying is disabled. | |
TPollerBase & | operator= (const TPollerBase &)=delete |
unsigned | AddTimer (TTime deadline, THandle h) |
Schedules a timer. | |
bool | RemoveTimer (unsigned timerId, TTime deadline) |
Removes or cancels a timer. | |
void | AddRead (int fd, THandle h) |
Registers a read event on a file descriptor. | |
void | AddWrite (int fd, THandle h) |
Registers a write event on a file descriptor. | |
void | AddRemoteHup (int fd, THandle h) |
Registers a remote hang-up (RHUP) event. | |
void | RemoveEvent (int fd) |
Removes registered events for a specific file descriptor. | |
void | RemoveEvent (THandle) |
Removes events associated with a given coroutine handle. | |
auto | Sleep (TTime until) |
Suspends execution until the specified time. | |
template<typename Rep, typename Period> | |
auto | Sleep (std::chrono::duration< Rep, Period > duration) |
Overload of Sleep() accepting a duration. | |
auto | Yield () |
Yields execution to the next event loop iteration. | |
void | Wakeup (TEvent &&change) |
Wakes up a coroutine waiting on an event. | |
void | WakeupReadyHandles () |
Wakes up all coroutines waiting on ready events. | |
void | SetMaxDuration (std::chrono::milliseconds maxDuration) |
Sets the maximum polling duration. | |
auto | TimersSize () const |
Returns the number of scheduled timers. | |
Additional Inherited Members | |
![]() | |
timespec | GetTimeout () const |
Computes the poll timeout based on scheduled timers. | |
void | Reset () |
Clears the lists of ready events and pending changes. | |
void | ProcessTimers () |
Processes scheduled timers. | |
![]() | |
static constexpr timespec | GetMaxDuration (std::chrono::milliseconds duration) |
Computes a timespec from a duration. | |
![]() | |
int | MaxFd_ = -1 |
Highest file descriptor in use. | |
std::vector< TEvent > | Changes_ |
Pending changes (registered events). | |
std::vector< TEvent > | ReadyEvents_ |
Events ready to wake up their coroutines. | |
unsigned | TimerId_ = 0 |
Counter for generating unique timer IDs. | |
std::priority_queue< TTimer > | Timers_ |
Priority queue for scheduled timers. | |
TTime | LastTimersProcessTime_ |
Last time timers were processed. | |
unsigned | LastFiredTimer_ = (unsigned)(-1) |
ID of the last fired timer. | |
std::chrono::milliseconds | MaxDuration_ = std::chrono::milliseconds(100) |
Maximum poll duration. | |
timespec | MaxDurationTs_ = GetMaxDuration(MaxDuration_) |
Max duration represented as timespec. | |
Poller implementation based on the poll() system call.
TPoll inherits from TPollerBase and implements asynchronous I/O event polling using the poll() system call. It manages events via a vector of pollfd structures and an internal list of event registrations (stored as tuples pairing THandlePair with an index).
Platform-specific notes:
DummySocket_
) is maintained to properly handle timeouts.This class provides type aliases for the socket and file handle types:
TSocket
is defined as NNet::TSocket.TFileHandle
is defined as NNet::TFileHandle.The main method is:
void NNet::TPoll::Poll | ( | ) |
Polls for I/O events.
This method uses the poll() system call to wait for registered events on file descriptors. It processes incoming events by matching them against the internal list of changes and then waking up any suspended coroutines waiting on those events.