calloop
Calloop, a Callback-based Event Loop
This crate provides an EventLoop
type, which is a small abstraction
over a polling system. The main difference between this crate
and other traditional rust event loops is that it is based on callbacks:
you can register several event sources, each being associated with a callback
closure that will be invoked whenever the associated event source generates
events.
The main target use of this event loop is thus for apps that expect to spend most of their time waiting for events and wishes to do so in a cheap and convenient way. It is not meant for large scale high performance IO.
How to use it
Below is a quick usage example of calloop. For a more in-depth tutorial, see the calloop book.
For simple uses, you can just add event sources with callbacks to the event loop. For example, here's a runnable program that exits after five seconds:
use ;
Event source types
The event loop is backed by an OS provided polling selector (epoll on Linux).
This crate also provide some adapters for common event sources such as:
- MPSC channels
- Timers
- unix signals on Linux
As well as generic objects backed by file descriptors.
It is also possible to insert "idle" callbacks. These callbacks represent computations that
need to be done at some point, but are not as urgent as processing the events. These callbacks
are stored and then executed during EventLoop::dispatch
, once all events from the sources
have been processed.
Async/Await compatibility
calloop
can be used with futures, both as an executor and for monitoring Async IO.
Activating the executor
cargo feature will add the futures
module, which provides
a future executor that can be inserted into an EventLoop
as yet another EventSource
.
IO objects can be made Async-aware via the LoopHandle::adapt_io
method. Waking up the
futures using these objects is handled by the associated EventLoop
directly.
Custom event sources
You can create custom event sources can will be inserted in the event loop by
implementing the EventSource
trait. This can be done either directly from the file
descriptors of your source of interest, or by wrapping an other event source and further
processing its events. An EventSource
can register more than one file descriptor and
aggregate them.
Platforms support
Currently, calloop is tested on Linux, FreeBSD and macOS.
The following platforms are also enabled at compile time but not tested: Android, NetBSD, OpenBSD, DragonFlyBSD.
Those platforms should work based on the fact that they have the same polling mechanism as tested platforms, but some subtle bugs might still occur.
Minimum Safe Rust Version
The current MSRV (Minimum Safe Rust Version) for this crate is Rust 1.63.
When the signals
feature is enabled, however, it will be bumped to nix
's
MSRV. At the time of writing this is Rust 1.69.
Prior to calloop
v1.0, bumps in the MSRV will result in bumps to the patch version. Once calloop
v1.0 is release, bumps in the MSRV will result in bumps to the minor version. In short, MSRV bumps are not considered breaking changes.
As a tentative policy, the base MSRV will not advance past the current Rust version provided by Debian Stable. At the time of writing, this version of Rust is 1.63. However, the MSRV may be advanced further in the event of a major ecosystem shift or a security vulnerability.
License: MIT