tiny.sys.event
Defined in tiny.sys.
API (46)
Actions
Public operations.
Async.deinitAsync.initAsync.notifyAsync.waitFile.initFdFile.pollLoop.awakeClockLoop.currentInstantLoop.deinitLoop.disarmLoop.initLoop.runTCP.acceptTCP.closeTCP.initFdTCP.readTCP.writeUDP.bindUDP.closeUDP.initFdUDP.recvFromUDP.sendTo
Types and contracts
Public types and contracts.
AcceptErrorAsyncAsync.WaitErrorCallbackActionCloseErrorCompletionDatagram: 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.FileLoopOptionsPollErrorPollEventReadBufferReadErrorRecvErrorRunModeSendErrorTCPTimerUDPUDP.BindErrorWriteBufferWriteError
Values and defaults
Public values and defaults.
Source
Source: lib/sys/src/event/poll.zig:499
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
pub const Completion = struct { active: bool = false, op: Operation = .none, userdata: ?*anyopaque = null, callback: ?Callback = null,};Source: lib/sys/src/event/poll.zig:795
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
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
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
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
pub const AcceptError = error{ Canceled, Again, Unexpected,};Source: lib/sys/src/event/types.zig:75
pub const CallbackAction = enum { disarm, rearm,};Source: lib/sys/src/event/types.zig:10
pub const CloseError = error{ Canceled, Unexpected,};Source: lib/sys/src/event/types.zig:57
/// 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
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
pub const PollError = error{ Canceled, Unexpected,};Source: lib/sys/src/event/types.zig:80
pub const PollEvent = enum { read,};Source: lib/sys/src/event/types.zig:84
pub const ReadBuffer = union(enum) { slice: []u8, array: [32]u8,};Source: lib/sys/src/event/types.zig:20
pub const ReadError = error{ EOF, Canceled, ConnectionResetByPeer, Unexpected,};Source: lib/sys/src/event/types.zig:27
pub const RecvError = error{ Canceled, ConnectionResetByPeer, Unexpected,};Source: lib/sys/src/event/types.zig:69
pub const RunMode = enum { no_wait, once, until_done,};Source: lib/sys/src/event/types.zig:33
pub const SendError = error{ Canceled, BrokenPipe, ConnectionResetByPeer, MessageTooLarge, Unexpected,};Source: lib/sys/src/event/types.zig:89
pub const WriteBuffer = union(enum) { slice: []const u8, array: struct { array: [32]u8, len: usize, },};Source: lib/sys/src/event/types.zig:41
pub const WriteError = error{ Canceled, BrokenPipe, ConnectionResetByPeer, Unexpected,};Source: lib/sys/src/event/root.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
pub const event = @import("event/root.zig");Complete caller list for event.Loop.deinit
17 direct callers.
lib.sys.src.event.poll.test_event_TCP_accepts_and_closes_a_loopback_connection[function] — test source atlib/sys/src/event/poll.zig:1541in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_close_replaces_an_unrelated_active_completion[function] — test source atlib/sys/src/event/poll.zig:1590in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_read_reports_peer_shutdown_as_EOF[function] — test source atlib/sys/src/event/poll.zig:1439in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_zero-length_read_preserves_a_ready_byte[function] — test source atlib/sys/src/event/poll.zig:1468in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_disarm_releases_an_active_completion[function] — test source atlib/sys/src/event/poll.zig:1231in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fake_clock_cancellation_prevents_a_delayed_timer[function] — test source atlib/sys/src/event/poll.zig:1301in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fake_clock_orders_and_delays_timers[function] — test source atlib/sys/src/event/poll.zig:1262in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fixed_delay_starts_after_a_late_callback[function] — test source atlib/sys/src/event/poll.zig:1359in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fixed_rate_skips_delayed_ticks_within_one_slot[function] — test source atlib/sys/src/event/poll.zig:1327in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_rejects_an_awake_clock_regression[function] — test source atlib/sys/src/event/poll.zig:1390in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_replaces_an_active_completion_without_consuming_another_entry[function] — test source atlib/sys/src/event/poll.zig:1199in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_timer_uses_owned_sys_event_types[function] — test source atlib/sys/src/event/poll.zig:1123in nearest public ownerlib.sys.src.event.polllib.sys.src.event.test.runRoundTrip[function] — private source atlib/sys/src/event/test.zig:179in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_disarm_preserves_the_receive_buffer_and_suppresses_its_callback[function] — test source atlib/sys/src/event/test.zig:311in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_rearm_receives_two_datagrams_through_one_completion[function] — test source atlib/sys/src/event/test.zig:351in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_reports_a_truncated_datagram_and_copied_byte_count[function] — test source atlib/sys/src/event/test.zig:272in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_surfaces_EMSGSIZE_for_an_oversized_datagram[function] — test source atlib/sys/src/event/test.zig:400in nearest public ownerlib.sys.src.event.test
Complete caller list for event.Loop.init
17 direct callers.
lib.sys.src.event.poll.test_event_TCP_accepts_and_closes_a_loopback_connection[function] — test source atlib/sys/src/event/poll.zig:1541in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_close_replaces_an_unrelated_active_completion[function] — test source atlib/sys/src/event/poll.zig:1590in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_read_reports_peer_shutdown_as_EOF[function] — test source atlib/sys/src/event/poll.zig:1439in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_zero-length_read_preserves_a_ready_byte[function] — test source atlib/sys/src/event/poll.zig:1468in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_disarm_releases_an_active_completion[function] — test source atlib/sys/src/event/poll.zig:1231in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fake_clock_cancellation_prevents_a_delayed_timer[function] — test source atlib/sys/src/event/poll.zig:1301in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fake_clock_orders_and_delays_timers[function] — test source atlib/sys/src/event/poll.zig:1262in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fixed_delay_starts_after_a_late_callback[function] — test source atlib/sys/src/event/poll.zig:1359in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fixed_rate_skips_delayed_ticks_within_one_slot[function] — test source atlib/sys/src/event/poll.zig:1327in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_rejects_an_awake_clock_regression[function] — test source atlib/sys/src/event/poll.zig:1390in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_replaces_an_active_completion_without_consuming_another_entry[function] — test source atlib/sys/src/event/poll.zig:1199in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_timer_uses_owned_sys_event_types[function] — test source atlib/sys/src/event/poll.zig:1123in nearest public ownerlib.sys.src.event.polllib.sys.src.event.test.runRoundTrip[function] — private source atlib/sys/src/event/test.zig:179in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_disarm_preserves_the_receive_buffer_and_suppresses_its_callback[function] — test source atlib/sys/src/event/test.zig:311in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_rearm_receives_two_datagrams_through_one_completion[function] — test source atlib/sys/src/event/test.zig:351in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_reports_a_truncated_datagram_and_copied_byte_count[function] — test source atlib/sys/src/event/test.zig:272in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_surfaces_EMSGSIZE_for_an_oversized_datagram[function] — test source atlib/sys/src/event/test.zig:400in nearest public ownerlib.sys.src.event.test
Complete caller list for event.Loop.run
16 direct callers.
lib.sys.src.event.poll.test_event_TCP_accepts_and_closes_a_loopback_connection[function] — test source atlib/sys/src/event/poll.zig:1541in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_read_reports_peer_shutdown_as_EOF[function] — test source atlib/sys/src/event/poll.zig:1439in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_TCP_zero-length_read_preserves_a_ready_byte[function] — test source atlib/sys/src/event/poll.zig:1468in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_disarm_releases_an_active_completion[function] — test source atlib/sys/src/event/poll.zig:1231in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fake_clock_cancellation_prevents_a_delayed_timer[function] — test source atlib/sys/src/event/poll.zig:1301in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fake_clock_orders_and_delays_timers[function] — test source atlib/sys/src/event/poll.zig:1262in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fixed_delay_starts_after_a_late_callback[function] — test source atlib/sys/src/event/poll.zig:1359in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_fixed_rate_skips_delayed_ticks_within_one_slot[function] — test source atlib/sys/src/event/poll.zig:1327in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_rejects_an_awake_clock_regression[function] — test source atlib/sys/src/event/poll.zig:1390in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_replaces_an_active_completion_without_consuming_another_entry[function] — test source atlib/sys/src/event/poll.zig:1199in nearest public ownerlib.sys.src.event.polllib.sys.src.event.poll.test_event_loop_timer_uses_owned_sys_event_types[function] — test source atlib/sys/src/event/poll.zig:1123in nearest public ownerlib.sys.src.event.polllib.sys.src.event.test.runRoundTrip[function] — private source atlib/sys/src/event/test.zig:179in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_disarm_preserves_the_receive_buffer_and_suppresses_its_callback[function] — test source atlib/sys/src/event/test.zig:311in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_rearm_receives_two_datagrams_through_one_completion[function] — test source atlib/sys/src/event/test.zig:351in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_reports_a_truncated_datagram_and_copied_byte_count[function] — test source atlib/sys/src/event/test.zig:272in nearest public ownerlib.sys.src.event.testlib.sys.src.event.test.test_event_UDP_surfaces_EMSGSIZE_for_an_oversized_datagram[function] — test source atlib/sys/src/event/test.zig:400in nearest public ownerlib.sys.src.event.test
Audit
| Definitions | 46 |
|---|---|
| Public names | 46 |
| Members | 54 |
| Version | 26.7.0 |
| Revision | daab053ee433 |