Asynchronous I/O (files, sockets, timers, processes, fs events, threads wake-up) (see Async) AsyncEventLoop pushes all AsyncRequest derived classes to I/O queues in the OS. More...
#include <Async.h>
Classes | |
struct | Options |
Options given to AsyncEventLoop::create. More... | |
Public Types | |
using | InternalOpaque = OpaqueObject<InternalDefinition> |
Public Member Functions | |
Result | create (Options options=Options()) |
Creates the event loop kernel object. | |
Result | close () |
Closes the event loop kernel object. | |
Result | start (AsyncRequest &async) |
Queues an async request request that has been correctly setup. | |
void | interrupt () |
Interrupts the event loop even if it has active request on it. | |
bool | isInitialized () const |
Returns true if create has been already called (successfully) | |
Result | run () |
Blocks until there are no more active queued requests, dispatching all completions. | |
Result | runOnce () |
Blocks until at least one request proceeds, ensuring forward progress, dispatching all completions. | |
Result | runNoWait () |
Process active requests if any, dispatching their completions, or returns immediately without blocking. | |
Result | submitRequests (AsyncKernelEvents &kernelEvents) |
Submits all queued async requests. | |
Result | blockingPoll (AsyncKernelEvents &kernelEvents) |
Blocks until at least one event happens, ensuring forward progress, without executing completions. | |
Result | dispatchCompletions (AsyncKernelEvents &kernelEvents) |
Invokes completions for the AsyncKernelEvents collected by a call to AsyncEventLoop::blockingPoll. | |
Result | wakeUpFromExternalThread (AsyncLoopWakeUp &wakeUp) |
Wake up the event loop from a thread different than the one where run() is called (and potentially blocked). | |
Result | wakeUpFromExternalThread () |
Wake up the event loop from a thread different than the one where run() is called (and potentially blocked) | |
Result | createAsyncTCPSocket (SocketFlags::AddressFamily family, SocketDescriptor &outDescriptor) |
Creates an async TCP (IPV4 / IPV6) socket registered with the eventLoop. | |
Result | createAsyncUDPSocket (SocketFlags::AddressFamily family, SocketDescriptor &outDescriptor) |
Creates an async UCP (IPV4 / IPV6) socket registered with the eventLoop. | |
Result | associateExternallyCreatedSocket (SocketDescriptor &outDescriptor) |
Associates a previously created TCP / UDP socket with the eventLoop. | |
Result | associateExternallyCreatedFileDescriptor (FileDescriptor &outDescriptor) |
Associates a previously created File Descriptor with the eventLoop. | |
void | updateTime () |
Updates loop time to "now". | |
Time::Monotonic | getLoopTime () const |
Get Loop time. | |
int | getNumberOfActiveRequests () const |
Obtain the total number of active requests. | |
int | getNumberOfSubmittedRequests () const |
Obtain the total number of submitted requests. | |
AsyncLoopTimeout * | findEarliestLoopTimeout () const |
Returns the next AsyncLoopTimeout that will be executed (shortest relativeTimeout) | |
void | excludeFromActiveCount (AsyncRequest &async) |
Excludes the request from active handles count (to avoid it keeping event loop alive) | |
void | includeInActiveCount (AsyncRequest &async) |
Reverses the effect of excludeFromActiveCount for the request. | |
void | enumerateRequests (Function< void(AsyncRequest &)> enumerationCallback) |
Enumerates all requests objects associated with this loop. | |
void | setListeners (AsyncEventLoopListeners *listeners) |
Sets reference to listeners that will signal different events in loop lifetime. | |
void | clearSequence (AsyncSequence &sequence) |
Clears the sequence. | |
Static Public Member Functions | |
static Result | removeAllAssociationsFor (SocketDescriptor &outDescriptor) |
Removes association of a TCP Socket with any event loop. | |
static Result | removeAllAssociationsFor (FileDescriptor &outDescriptor) |
Removes association of a File Descriptor with any event loop. | |
static bool | isExcludedFromActiveCount (const AsyncRequest &async) |
Checks if excludeFromActiveCount() has been called on the given request. | |
static bool | tryLoadingLiburing () |
Check if liburing is loadable (only on Linux) | |
Friends | |
struct | AsyncRequest |
struct | AsyncFileWrite |
struct | AsyncFileRead |
struct | AsyncResult |
Asynchronous I/O (files, sockets, timers, processes, fs events, threads wake-up) (see Async) AsyncEventLoop pushes all AsyncRequest derived classes to I/O queues in the OS.
Basic lifetime for an event loop is:
Result SC::AsyncEventLoop::associateExternallyCreatedFileDescriptor | ( | FileDescriptor & | outDescriptor | ) |
Associates a previously created File Descriptor with the eventLoop.
Result SC::AsyncEventLoop::associateExternallyCreatedSocket | ( | SocketDescriptor & | outDescriptor | ) |
Associates a previously created TCP / UDP socket with the eventLoop.
Result SC::AsyncEventLoop::blockingPoll | ( | AsyncKernelEvents & | kernelEvents | ) |
Blocks until at least one event happens, ensuring forward progress, without executing completions.
It's one of the three building blocks of AsyncEventLoop::runOnce allowing co-operation of AsyncEventLoop within another event loop (for example a GUI event loop or another IO event loop).
One possible example of such integration with a GUI event loop could:
Waiting on requests blocks the current thread with 0% CPU utilization.
kernelEvents | Mandatory parameter to store kernel IO events WITHOUT running their completions. In that case user is expected to run completions passing it to AsyncEventLoop::dispatchCompletions. |
void SC::AsyncEventLoop::clearSequence | ( | AsyncSequence & | sequence | ) |
Clears the sequence.
Result SC::AsyncEventLoop::close | ( | ) |
Closes the event loop kernel object.
Creates the event loop kernel object.
Result SC::AsyncEventLoop::createAsyncTCPSocket | ( | SocketFlags::AddressFamily | family, |
SocketDescriptor & | outDescriptor ) |
Creates an async TCP (IPV4 / IPV6) socket registered with the eventLoop.
Result SC::AsyncEventLoop::createAsyncUDPSocket | ( | SocketFlags::AddressFamily | family, |
SocketDescriptor & | outDescriptor ) |
Creates an async UCP (IPV4 / IPV6) socket registered with the eventLoop.
Result SC::AsyncEventLoop::dispatchCompletions | ( | AsyncKernelEvents & | kernelEvents | ) |
Invokes completions for the AsyncKernelEvents collected by a call to AsyncEventLoop::blockingPoll.
This is typically done when user wants to pool for events on a thread (calling AsyncEventLoop::blockingPoll) and dispatch the callbacks on another thread (calling AsyncEventLoop::dispatchCompletions). The typical example would be integrating AsyncEventLoop with a GUI event loop.
void SC::AsyncEventLoop::enumerateRequests | ( | Function< void(AsyncRequest &)> | enumerationCallback | ) |
Enumerates all requests objects associated with this loop.
void SC::AsyncEventLoop::excludeFromActiveCount | ( | AsyncRequest & | async | ) |
Excludes the request from active handles count (to avoid it keeping event loop alive)
|
nodiscard |
Returns the next AsyncLoopTimeout that will be executed (shortest relativeTimeout)
nullptr
if no AsyncLoopTimeout has been started or scheduled
|
nodiscard |
Get Loop time.
|
nodiscard |
Obtain the total number of active requests.
|
nodiscard |
Obtain the total number of submitted requests.
void SC::AsyncEventLoop::includeInActiveCount | ( | AsyncRequest & | async | ) |
Reverses the effect of excludeFromActiveCount for the request.
void SC::AsyncEventLoop::interrupt | ( | ) |
Interrupts the event loop even if it has active request on it.
|
staticnodiscard |
Checks if excludeFromActiveCount() has been called on the given request.
|
nodiscard |
Returns true
if create has been already called (successfully)
|
static |
Removes association of a File Descriptor with any event loop.
|
static |
Removes association of a TCP Socket with any event loop.
Result SC::AsyncEventLoop::run | ( | ) |
Blocks until there are no more active queued requests, dispatching all completions.
It's useful for applications where the eventLoop is the only (or the main) loop. One example could be a console based app doing socket IO or a web server. Waiting on kernel events blocks the current thread with 0% CPU utilization.
Result SC::AsyncEventLoop::runNoWait | ( | ) |
Process active requests if any, dispatching their completions, or returns immediately without blocking.
It's useful for game-like applications where the event loop runs every frame and one would like to check and dispatch its I/O callbacks in-between frames. This call allows poll-checking I/O without blocking.
Result SC::AsyncEventLoop::runOnce | ( | ) |
Blocks until at least one request proceeds, ensuring forward progress, dispatching all completions.
It's useful for application where it's needed to run some idle work after every IO event. Waiting on requests blocks the current thread with 0% CPU utilization.
This function is a shortcut invoking async event loop building blocks:
void SC::AsyncEventLoop::setListeners | ( | AsyncEventLoopListeners * | listeners | ) |
Sets reference to listeners that will signal different events in loop lifetime.
Result SC::AsyncEventLoop::start | ( | AsyncRequest & | async | ) |
Queues an async request request that has been correctly setup.
Result SC::AsyncEventLoop::submitRequests | ( | AsyncKernelEvents & | kernelEvents | ) |
Submits all queued async requests.
An AsyncRequest becomes queued after user calls its specific AsyncRequest::start method.
|
staticnodiscard |
Check if liburing is loadable (only on Linux)
void SC::AsyncEventLoop::updateTime | ( | ) |
Updates loop time to "now".
Result SC::AsyncEventLoop::wakeUpFromExternalThread | ( | ) |
Wake up the event loop from a thread different than the one where run() is called (and potentially blocked)
Result SC::AsyncEventLoop::wakeUpFromExternalThread | ( | AsyncLoopWakeUp & | wakeUp | ) |
Wake up the event loop from a thread different than the one where run() is called (and potentially blocked).
The parameter is an AsyncLoopWakeUp that must have been previously started (with AsyncLoopWakeUp::start).