AsyncReactor API Reference

Platform-independent event loop (kqueue/epoll/IOCP)

Import

U std/async_reactor

Constants

Platform Constants

ConstantValueBackend
PLATFORM_UNKNOWN0Unknown platform
PLATFORM_MACOS1kqueue
PLATFORM_LINUX2epoll
PLATFORM_WINDOWS3IOCP

Event Filter Constants

ConstantValueDescription
REACTOR_READ-1Read readiness
REACTOR_WRITE-2Write readiness
REACTOR_TIMER-7Timer event

Event Action Constants

ConstantValueDescription
REACTOR_ADD1Add event
REACTOR_DELETE2Delete event
REACTOR_ONESHOT16Oneshot flag

Configuration Constants

ConstantValueDescription
REACTOR_MAX_EVENTS64Maximum events per poll

Structs

ReactorEvent

A single I/O event.

S ReactorEvent { fd: i64, filter: i64 }
MethodSignatureDescription
newF new(fd: i64, filter: i64) -> ReactorEventCreate event
is_readF is_read(&self) -> i64Check if read event
is_writeF is_write(&self) -> i64Check if write event
is_timerF is_timer(&self) -> i64Check if timer event

ReactorSource

Tracks what a task is waiting on.

S ReactorSource { source_type: i64, fd: i64, task_ptr: i64, deadline_ms: i64, next: i64 }

Reactor

Platform-independent event loop.

S Reactor {
    backend_fd: i64,
    platform: i64,
    waker_read_fd: i64,
    waker_write_fd: i64,
    sources_head: i64,
    sources_tail: i64,
    source_count: i64,
    events_buf: i64,
    running: i64
}
MethodSignatureDescription
newF new() -> ReactorCreate reactor for current platform
get_platformF get_platform(&self) -> i64Get current platform ID
platform_nameF platform_name(&self) -> i64Get platform name string
register_readF register_read(&self, fd: i64, task_ptr: i64) -> i64Watch fd for read
register_writeF register_write(&self, fd: i64, task_ptr: i64) -> i64Watch fd for write
register_timerF register_timer(&self, timer_id: i64, delay_ms: i64, task_ptr: i64) -> i64Register timer
deregisterF deregister(&self, fd: i64, filter: i64) -> i64Remove event source
add_sourceF add_source(&self, source_type: i64, fd: i64, task_ptr: i64, deadline_ms: i64) -> i64Add to tracking list
remove_sourceF remove_source(&self, fd: i64) -> i64Remove from tracking list
find_task_for_fdF find_task_for_fd(&self, fd: i64) -> i64Find task waiting on fd
wakeF wake(&self) -> i64Wake up reactor
drain_wakerF drain_waker(&self) -> i64Drain waker pipe
pollF poll(&self, timeout_ms: i64) -> i64Poll for events (returns count)
event_fdF event_fd(&self, index: i64) -> i64Get fd of event at index
event_filterF event_filter(&self, index: i64) -> i64Get filter of event at index
is_waker_eventF is_waker_event(&self, index: i64) -> i64Check if event is from waker
process_eventsF process_events(&self, n_events: i64) -> i64Wake tasks (returns tasks woken)
cleanupF cleanup(&self) -> i64Free all resources

Global Reactor Functions

These functions operate on the global reactor instance.

FunctionSignatureDescription
reactor_instance_initF reactor_instance_init() -> i64Initialize global reactor
get_reactor_instanceF get_reactor_instance() -> i64Get global reactor
reactor_register_readF reactor_register_read(fd: i64, task_ptr: i64) -> i64Register read on global reactor
reactor_register_writeF reactor_register_write(fd: i64, task_ptr: i64) -> i64Register write on global reactor
reactor_register_timerF reactor_register_timer(timer_id: i64, delay_ms: i64, task_ptr: i64) -> i64Register timer on global reactor
reactor_pollF reactor_poll(timeout_ms: i64) -> i64Poll global reactor
reactor_process_eventsF reactor_process_events(n_events: i64) -> i64Process events on global reactor
reactor_wakeF reactor_wake() -> i64Wake global reactor
reactor_cleanupF reactor_cleanup() -> i64Cleanup global reactor
reactor_get_platformF reactor_get_platform() -> i64Get platform ID

Usage

Using a local Reactor instance

U std/async_reactor

F main() -> i64 {
    reactor := Reactor::new()
    platform := reactor.get_platform()  # 1, 2, or 3

    reactor.register_read(socket_fd, task_ptr)
    reactor.register_timer(42, 1000, task_ptr)

    n := reactor.poll(1000)  # Wait 1 second
    reactor.process_events(n)

    reactor.cleanup()
    0
}

Using the global reactor

U std/async_reactor

F main() -> i64 {
    reactor_register_read(socket_fd, task_ptr)

    n := reactor_poll(1000)
    reactor_process_events(n)

    reactor_cleanup()
    0
}