Skip to documentation
SLOP

tiny.sys.event

Reference tiny.sys event

Defined in tiny.sys.

API (46)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callstiny.sysevent
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/sys/src/event/poll.zig:499

zig
pub const Async = struct {    read_fd: fd.Descriptor,    write_fd: fd.Descriptor,    pub const WaitError: type = ReadError;    pub fn init() !Async {        const pipe_fds = try fd.pipeWithOptions(.{ .close_on_exec = true, .nonblocking = true });        return .{ .read_fd = pipe_fds[0], .write_fd = pipe_fds[1] };    }    pub fn deinit(self: *Async) void {        fd.close(self.read_fd);        fd.close(self.write_fd);        self.* = undefined;    }    pub fn wait(        self: Async,        loop: *Loop,        completion: *Completion,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            result: WaitError!void,        ) CallbackAction,    ) void {        loop.arm(            completion,            .{ .async_wait = self },            userdata,            AsyncWaitCallback(Userdata, cb).callback,        );    }    pub fn notify(self: Async) !void {        _ = fd.write(self.write_fd, &.{1}) catch |err| switch (err) {            error.WouldBlock => return,            else => return err,        };    }    fn drain(self: Async) void {        var buffer: [64]u8 = undefined;        while (true) {            _ = fd.read(self.read_fd, &buffer) catch |err| switch (err) {                error.WouldBlock => return,                else => return,            };        }    }};

Source: lib/sys/src/event/poll.zig:124

zig
pub const Completion = struct {    active: bool = false,    op: Operation = .none,    userdata: ?*anyopaque = null,    callback: ?Callback = null,};

Source: lib/sys/src/event/poll.zig:795

zig
pub const File = struct {    fd: fd.Descriptor,    pub fn initFd(file_fd: std.Io.File.Handle) File {        return .{ .fd = file_fd };    }    pub fn poll(        self: File,        loop: *Loop,        completion: *Completion,        event: PollEvent,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            file: File,            result: PollError!PollEvent,        ) CallbackAction,    ) void {        loop.arm(            completion,            .{ .file_poll = .{ .file = self, .event = event } },            userdata,            FilePollCallback(Userdata, cb).callback,        );    }};

Source: lib/sys/src/event/poll.zig:131

zig
pub const Loop = struct {    allocator: std.mem.Allocator,    awake_clock: time.AwakeClock,    last_instant: ?time.AwakeInstant,    entries: []?*Completion,    pollfds: []descriptor_poll.Descriptor,    poll_completions: []*Completion,    pub fn init(options: Options) !Loop {        const allocator = options.allocator;        const count: usize = @intCast(options.entries);        const entries = try allocator.alloc(?*Completion, count);        errdefer allocator.free(entries);        @memset(entries, null);        const pollfds = try allocator.alloc(descriptor_poll.Descriptor, count);        errdefer allocator.free(pollfds);        const poll_completions = try allocator.alloc(*Completion, count);        errdefer allocator.free(poll_completions);        return .{            .allocator = allocator,            .awake_clock = options.awake_clock,            .last_instant = null,            .entries = entries,            .pollfds = pollfds,            .poll_completions = poll_completions,        };    }    pub fn deinit(self: *Loop) void {        self.allocator.free(self.poll_completions);        self.allocator.free(self.pollfds);        self.allocator.free(self.entries);        self.* = undefined;    }    pub fn run(self: *Loop, mode: RunMode) !void {        while (self.hasActive()) {            const now = try self.readInstant();            if (try self.fireDueTimer(now)) {                if (mode != .until_done) return;                continue;            }            const poll_count = self.preparePoll();            const timeout_ms = self.timeoutMillis(mode, now);            if (poll_count == 0) {                if (timeout_ms < 0) return;                if (timeout_ms > 0) {                    const timeout_ns = @as(u64, @intCast(timeout_ms)) *                        std.time.ns_per_ms;                    std.Io.sleep(                        std.Options.debug_io,                        .fromNanoseconds(timeout_ns),                        .awake,                    ) catch {};                }                if (mode != .until_done) return;                continue;            }            const ready = descriptor_poll.wait(self.pollfds[0..poll_count], timeout_ms) catch                return error.Unexpected;            if (ready == 0) {                if (mode != .until_done) return;                continue;            }            _ = try self.readInstant();            if (try self.fireFirstReady(poll_count) and mode != .until_done) return;            if (mode == .no_wait) return;        }    }    pub fn currentInstant(self: *const Loop) time.AwakeInstant {        return self.last_instant orelse @panic("sys.event loop has not sampled its awake clock");    }    pub fn awakeClock(self: *const Loop) time.AwakeClock {        return self.awake_clock;    }    pub fn disarm(self: *Loop, completion: *Completion) void {        self.deactivate(completion);        completion.* = .{};    }    fn activate(self: *Loop, completion: *Completion) void {        if (completion.active) {            for (self.entries) |slot| {                if (slot == completion) return;            }            @panic("sys.event active completion belongs to another loop");        }        for (self.entries) |*slot| {            if (slot.* == null) {                slot.* = completion;                completion.active = true;                return;            }        }        @panic("sys.event loop completion capacity exhausted");    }    fn arm(        self: *Loop,        completion: *Completion,        op: Operation,        userdata: ?*anyopaque,        callback: Callback,    ) void {        var replacement: Completion = .{            .op = op,            .userdata = userdata,            .callback = callback,        };        if (completion.active) {            for (self.entries) |slot| {                if (slot == completion) {                    replacement.active = true;                    completion.* = replacement;                    return;                }            }            @panic("sys.event active completion belongs to another loop");        }        completion.* = replacement;        self.activate(completion);    }    fn deactivate(self: *Loop, completion: *Completion) void {        if (!completion.active) return;        for (self.entries) |*slot| {            if (slot.* == completion) {                slot.* = null;                completion.active = false;                return;            }        }        @panic("sys.event active completion belongs to another loop");    }    fn deactivateDescriptor(self: *Loop, descriptor: fd.Descriptor) void {        for (self.entries) |*slot| {            const completion = slot.* orelse continue;            if (completion.op.descriptor()) |active_descriptor| {                if (active_descriptor == descriptor) {                    completion.active = false;                    slot.* = null;                }            }        }    }    fn hasActive(self: *Loop) bool {        for (self.entries) |slot| {            if (slot != null) return true;        }        return false;    }    fn preparePoll(self: *Loop) usize {        var count: usize = 0;        for (self.entries) |slot| {            const completion = slot orelse continue;            const descriptor = completion.op.descriptor() orelse continue;            self.pollfds[count] = .{                .fd = descriptor,                .events = completion.op.events(),                .revents = 0,            };            self.poll_completions[count] = completion;            count += 1;        }        return count;    }    fn timeoutMillis(self: *Loop, mode: RunMode, now: time.AwakeInstant) i32 {        if (mode == .no_wait) return 0;        var best: ?u64 = null;        for (self.entries) |slot| {            const completion = slot orelse continue;            switch (completion.op) {                .timer => |timer| {                    const remaining = now.remainingUntil(timer.deadline).asMillisecondsCeil();                    best = if (best) |current| @min(current, remaining) else remaining;                },                else => {},            }        }        const value = best orelse return -1;        return @intCast(@min(value, std.math.maxInt(i32)));    }    fn fireDueTimer(self: *Loop, now: time.AwakeInstant) time.ClockError!bool {        var due: ?*Completion = null;        for (self.entries) |slot| {            const completion = slot orelse continue;            switch (completion.op) {                .timer => |timer| {                    if (!now.reached(timer.deadline)) continue;                    const current = due orelse {                        due = completion;                        continue;                    };                    const current_timer = switch (current.op) {                        .timer => |value| value,                        else => unreachable,                    };                    if (timer.deadline.isBefore(current_timer.deadline)) due = completion;                },                else => {},            }        }        const completion = due orelse return false;        try self.fire(completion, .{ .timer = {} });        return true;    }    fn fireFirstReady(self: *Loop, count: usize) time.ClockError!bool {        var index: usize = 0;        while (index < count) : (index += 1) {            if (self.pollfds[index].revents == 0) continue;            const completion = self.poll_completions[index];            if (!completion.active) continue;            try self.fireReady(completion);            return true;        }        return false;    }    fn fireReady(self: *Loop, completion: *Completion) time.ClockError!void {        switch (completion.op) {            .async_wait => |async_watcher| {                async_watcher.drain();                try self.fire(completion, .{ .async_wait = {} });            },            .tcp_accept => |socket| {                const result = acceptSocket(socket);                try self.fire(completion, .{ .tcp_accept = result });            },            .tcp_read => |*state| {                const result = readSocket(state);                try self.fire(completion, .{ .tcp_read = .{                    .socket = state.socket,                    .buffer = state.buffer,                    .result = result,                } });            },            .tcp_write => |*state| {                const result = writeSocket(state);                try self.fire(completion, .{ .tcp_write = .{                    .socket = state.socket,                    .buffer = state.buffer,                    .result = result,                } });            },            .udp_recv_from => |*state| try self.fireUdpRecvFrom(completion, state),            .udp_send_to => |*state| try self.fireUdpSendTo(completion, state),            .file_poll => |state| {                try self.fire(completion, .{ .file_poll = .{                    .file = state.file,                    .result = state.event,                } });            },            .none, .timer => {},        }    }    fn fireUdpRecvFrom(        self: *Loop,        completion: *Completion,        state: *UdpRecvFromState,    ) time.ClockError!void {        const received = net.recvFromIpAddress(            state.socket.fd,            readSlice(&state.buffer),            0,        ) catch |err| {            if (err == error.WouldBlock) return;            const result: RecvError = switch (err) {                error.ConnectionResetByPeer => error.ConnectionResetByPeer,                else => error.Unexpected,            };            try self.fire(completion, .{ .udp_recv_from = .{                .socket = state.socket,                .buffer = state.buffer,                .result = result,            } });            return;        };        try self.fire(completion, .{ .udp_recv_from = .{            .socket = state.socket,            .buffer = state.buffer,            .result = Datagram{                .address = received.address,                .bytes = received.bytes,                .truncated = received.truncated,            },        } });    }    fn fireUdpSendTo(        self: *Loop,        completion: *Completion,        state: *const UdpSendToState,    ) time.ClockError!void {        const bytes = writeSlice(&state.buffer);        const sent = net.sendToIpAddress(state.socket.fd, bytes, 0, state.address) catch |err| {            if (err == error.WouldBlock) return;            const result: SendError = switch (err) {                error.BrokenPipe => error.BrokenPipe,                error.ConnectionResetByPeer => error.ConnectionResetByPeer,                error.MessageTooLarge => error.MessageTooLarge,                else => error.Unexpected,            };            try self.fire(completion, .{ .udp_send_to = .{                .socket = state.socket,                .buffer = state.buffer,                .result = result,            } });            return;        };        std.debug.assert(sent == bytes.len);        try self.fire(completion, .{ .udp_send_to = .{            .socket = state.socket,            .buffer = state.buffer,            .result = sent,        } });    }    fn fire(self: *Loop, completion: *Completion, result: Result) time.ClockError!void {        const callback = completion.callback orelse return;        self.deactivate(completion);        const action = callback(completion.userdata, self, completion, result);        if (action == .rearm) {            switch (completion.op) {                .timer => |*timer| timer.deadline = try self.rearmDeadline(timer.*),                else => {},            }            self.activate(completion);        }    }    fn readInstant(self: *Loop) time.ClockError!time.AwakeInstant {        const current = try self.awake_clock.now();        if (self.last_instant) |previous| _ = try current.elapsedSince(previous);        self.last_instant = current;        return current;    }    fn rearmDeadline(self: *Loop, timer: TimerState) time.ClockError!time.AwakeInstant {        const repeat = timer.repeat orelse @panic("sys.event timer rearm needs a repeat policy");        const now = try self.readInstant();        const interval = switch (repeat) {            .fixed_delay, .fixed_rate => |value| value,        };        const deadline = switch (repeat) {            .fixed_delay => now.deadlineAfter(interval),            .fixed_rate => fixedRateDeadline(timer.deadline, now, interval),        };        if (!interval.isZero() and now.reached(deadline)) return error.ClockOverflow;        return deadline;    }};

Source: lib/sys/src/event/poll.zig:613

zig
pub const TCP = struct {    fd: net.Socket,    pub fn initFd(socket_fd: anytype) TCP {        return .{ .fd = @intCast(socket_fd) };    }    pub fn accept(        self: TCP,        loop: *Loop,        completion: *Completion,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            result: AcceptError!TCP,        ) CallbackAction,    ) void {        loop.arm(            completion,            .{ .tcp_accept = self },            userdata,            TcpAcceptCallback(Userdata, cb).callback,        );    }    pub fn read(        self: TCP,        loop: *Loop,        completion: *Completion,        buffer: ReadBuffer,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            socket: TCP,            buffer: ReadBuffer,            result: ReadError!usize,        ) CallbackAction,    ) void {        loop.arm(            completion,            .{ .tcp_read = .{ .socket = self, .buffer = buffer } },            userdata,            TcpReadCallback(Userdata, cb).callback,        );    }    pub fn write(        self: TCP,        loop: *Loop,        completion: *Completion,        buffer: WriteBuffer,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            socket: TCP,            buffer: WriteBuffer,            result: WriteError!usize,        ) CallbackAction,    ) void {        loop.arm(            completion,            .{ .tcp_write = .{ .socket = self, .buffer = buffer } },            userdata,            TcpWriteCallback(Userdata, cb).callback,        );    }    pub fn close(        self: TCP,        loop: *Loop,        completion: *Completion,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            socket: TCP,            result: CloseError!void,        ) CallbackAction,    ) void {        loop.deactivateDescriptor(self.fd);        loop.deactivate(completion);        net.close(self.fd);        completion.* = .{            .userdata = userdata,            .callback = TcpCloseCallback(Userdata, cb).callback,        };        loop.fire(            completion,            .{ .tcp_close = .{ .socket = self, .result = {} } },        ) catch unreachable;    }};

Source: lib/sys/src/event/poll.zig:717

zig
pub const UDP = struct {    fd: net.Socket,    pub const BindError = net.SocketError || net.BindError;    pub fn initFd(socket_fd: anytype) UDP {        return .{ .fd = @intCast(socket_fd) };    }    pub fn bind(address: net.IpAddress) BindError!UDP {        const socket_fd = try net.udpDatagramSocketForAddress(address, .{            .close_on_exec = true,            .nonblocking = true,        });        errdefer net.close(socket_fd);        try net.bindIpAddress(socket_fd, address);        return initFd(socket_fd);    }    pub fn recvFrom(        self: UDP,        loop: *Loop,        completion: *Completion,        buffer: ReadBuffer,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            socket: UDP,            buffer: ReadBuffer,            result: RecvError!Datagram,        ) CallbackAction,    ) void {        std.debug.assert(readBufferLength(buffer) > 0);        loop.arm(            completion,            .{ .udp_recv_from = .{ .socket = self, .buffer = buffer } },            userdata,            UdpRecvFromCallback(Userdata, cb).callback,        );    }    pub fn sendTo(        self: UDP,        loop: *Loop,        completion: *Completion,        buffer: WriteBuffer,        address: net.IpAddress,        comptime Userdata: type,        userdata: ?*Userdata,        comptime cb: *const fn (            ud: ?*Userdata,            loop: *Loop,            completion: *Completion,            socket: UDP,            buffer: WriteBuffer,            result: SendError!usize,        ) CallbackAction,    ) void {        loop.arm(            completion,            .{ .udp_send_to = .{                .socket = self,                .buffer = buffer,                .address = address,            } },            userdata,            UdpSendToCallback(Userdata, cb).callback,        );    }    pub fn close(self: UDP) void {        net.close(self.fd);    }};

Source: lib/sys/src/event/types.zig:4

zig
pub const AcceptError = error{    Canceled,    Again,    Unexpected,};

Source: lib/sys/src/event/types.zig:75

zig
pub const CallbackAction = enum {    disarm,    rearm,};

Source: lib/sys/src/event/types.zig:10

zig
pub const CloseError = error{    Canceled,    Unexpected,};

Source: lib/sys/src/event/types.zig:57

zig
/// Record of one UDP message that arrived, read once a UDP receive completes to/// learn who sent the message and whether all of it arrived. A caller hands a/// buffer to the event loop when it arms a receive. The payload byte count/// reports what landed in that armed buffer and stops at its length, and a/// separate flag reports whether the message ran past the end of it. On Linux/// the flag is exact, because the kernel reports the message's full length and/// the receive compares it against the buffer length, while on every other host/// the flag is set whenever the byte count equals the armed buffer's length, so/// a message that exactly fills the buffer reports as truncated.pub const Datagram = struct {    address: sys.net.IpAddress,    bytes: usize,    truncated: bool,};

Source: lib/sys/src/event/types.zig:63

zig
pub const Options = struct {    entries: u32 = 256,    allocator: std.mem.Allocator = sys.allocator.processAllocator(),    awake_clock: sys.time.AwakeClock = .system(),};

Source: lib/sys/src/event/types.zig:15

zig
pub const PollError = error{    Canceled,    Unexpected,};

Source: lib/sys/src/event/types.zig:80

zig
pub const PollEvent = enum {    read,};

Source: lib/sys/src/event/types.zig:84

zig
pub const ReadBuffer = union(enum) {    slice: []u8,    array: [32]u8,};

Source: lib/sys/src/event/types.zig:20

zig
pub const ReadError = error{    EOF,    Canceled,    ConnectionResetByPeer,    Unexpected,};

Source: lib/sys/src/event/types.zig:27

zig
pub const RecvError = error{    Canceled,    ConnectionResetByPeer,    Unexpected,};

Source: lib/sys/src/event/types.zig:69

zig
pub const RunMode = enum {    no_wait,    once,    until_done,};

Source: lib/sys/src/event/types.zig:33

zig
pub const SendError = error{    Canceled,    BrokenPipe,    ConnectionResetByPeer,    MessageTooLarge,    Unexpected,};

Source: lib/sys/src/event/types.zig:89

zig
pub const WriteBuffer = union(enum) {    slice: []const u8,    array: struct {        array: [32]u8,        len: usize,    },};

Source: lib/sys/src/event/types.zig:41

zig
pub const WriteError = error{    Canceled,    BrokenPipe,    ConnectionResetByPeer,    Unexpected,};
Called byCallsNo direct callersfdcloseevent.Asyncdeinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersfdpipeWithOptionsevent.Asyncinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersfdwriteevent.Asyncnotify
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollAsyncWaitCallbackevent.Asyncwait
Static calls · unresolved targets: 1 · external targets: 1.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollFilePollCallbackevent.Filepoll
Static calls · unresolved targets: 1 · external targets: 1.
Called byCallsNo direct callstest sourcelib.sys.src.event.polltest: event TCP accepts and closes a ...test sourcelib.sys.src.event.polltest: event TCP close replaces an unr...test sourcelib.sys.src.event.polltest: event TCP read reports peer shu...test sourcelib.sys.src.event.polltest: event TCP zero-length read pres...test sourcelib.sys.src.event.polltest: event loop disarm releases an a...+12 moreevent.Loopdeinit
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallstest sourcelib.sys.src.event.polltest: event loop disarm releases an a...test sourcelib.sys.src.event.polltest: event loop fake clock cancellat...test sourcelib.sys.src.event.testtest: event UDP disarm preserves the ...private sourcelib.sys.src.event.poll.Loopdeactivateevent.Loopdisarm
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.sys.src.event.polltest: event TCP accepts and closes a ...test sourcelib.sys.src.event.polltest: event TCP close replaces an unr...test sourcelib.sys.src.event.polltest: event TCP read reports peer shu...test sourcelib.sys.src.event.polltest: event TCP zero-length read pres...test sourcelib.sys.src.event.polltest: event loop disarm releases an a...+12 moreevent.Loopinit
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallstest sourcelib.sys.src.event.polltest: event TCP accepts and closes a ...test sourcelib.sys.src.event.polltest: event TCP read reports peer shu...test sourcelib.sys.src.event.polltest: event TCP zero-length read pres...test sourcelib.sys.src.event.polltest: event loop disarm releases an a...test sourcelib.sys.src.event.polltest: event loop fake clock cancellat...+11 moreprivate sourcelib.sys.src.event.poll.LoopfireDueTimerprivate sourcelib.sys.src.event.poll.LoopfireFirstReadyprivate sourcelib.sys.src.event.poll.LoophasActiveprivate sourcelib.sys.src.event.poll.LooppreparePollprivate sourcelib.sys.src.event.poll.LoopreadInstantprivate sourcelib.sys.src.event.poll.LooptimeoutMillisevent.Looprun
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollTcpAcceptCallbackevent.TCPaccept
Static calls · unresolved targets: 1 · external targets: 1.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollTcpCloseCallbacknetcloseevent.TCPclose
Static calls · unresolved targets: 1 · external targets: 3.
Called byCallsNo direct callsprivate sourcelib.sys.src.event.pollacceptSockettest sourcelib.sys.src.event.polltest: event TCP accepts and closes a ...test sourcelib.sys.src.event.polltest: event TCP close replaces an unr...test sourcelib.sys.src.event.polltest: event TCP read reports peer shu...test sourcelib.sys.src.event.polltest: event TCP zero-length read pres...event.TCPinitFd
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollTcpReadCallbackevent.TCPread
Static calls · unresolved targets: 1 · external targets: 1.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollTcpWriteCallbackevent.TCPwrite
Static calls · unresolved targets: 1 · external targets: 1.
Called byCallsprivate sourcelib.sys.src.event.test.UdpPairinitnetbindIpAddressnetclosenetudpDatagramSocketForAddressevent.UDPbind
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsprivate sourcelib.sys.src.event.test.UdpPairclosenetcloseevent.UDPclose
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollUdpRecvFromCallbackprivate sourcelib.sys.src.event.pollreadBufferLengthevent.UDPrecvFrom
Static calls · unresolved targets: 1 · external targets: 1.
Called byCallsNo direct callersprivate sourcelib.sys.src.event.pollUdpSendToCallbackevent.UDPsendTo
Static calls · unresolved targets: 1 · external targets: 1.

Source: lib/sys/src/event/root.zig

zig
const sys = @import("../root.zig");const types = @import("types.zig");const backend = @import("poll.zig");pub const required_capabilities = sys.capabilities.host(&.{ .descriptors, .event_loop, .networking, .time });pub const AcceptError = types.AcceptError;pub const CallbackAction = types.CallbackAction;pub const CloseError = types.CloseError;pub const Datagram = types.Datagram;pub const Options = types.Options;pub const PollError = types.PollError;pub const PollEvent = types.PollEvent;pub const ReadBuffer = types.ReadBuffer;pub const ReadError = types.ReadError;pub const RecvError = types.RecvError;pub const RunMode = types.RunMode;pub const SendError = types.SendError;pub const WriteBuffer = types.WriteBuffer;pub const WriteError = types.WriteError;pub const Async = backend.Async;pub const Completion = backend.Completion;pub const File = backend.File;pub const Loop = backend.Loop;pub const TCP = backend.TCP;pub const Timer = backend.Timer;pub const UDP = backend.UDP;

Source: lib/sys/src/root.zig:29

zig
pub const event = @import("event/root.zig");

Complete caller list for event.Loop.deinit

17 direct callers.

Complete caller list for event.Loop.init

17 direct callers.

Complete caller list for event.Loop.run

16 direct callers.

Audit

Definitions46
Public names46
Members54
Version26.7.0
Revisiondaab053ee433