feature. See also
. The project being documented here (as the example) is the Zig library itself.
Uring.init
pub fn init(ev: *Evented, backing_allocator: Allocator, options: InitOptions) !void
File
Code
pub fn init(ev: *Evented, backing_allocator: Allocator, options: InitOptions) !void {
const threads_size = @sizeOf(Thread) * if (options.thread_limit) |thread_limit|
1 + thread_limit
else
@max(std.Thread.getCpuCount() catch 1, 1);
const idle_stack_end_offset =
std.mem.alignForward(usize, threads_size + idle_stack_size, std.heap.pageSize());
const allocated_slice = try backing_allocator.alignedAlloc(u8, .of(Thread), idle_stack_end_offset);
errdefer backing_allocator.free(allocated_slice);
ev.* = .{
.backing_allocator_needs_mutex = options.backing_allocator_needs_mutex,
.backing_allocator_mutex = .init,
.backing_allocator = backing_allocator,
.main_fiber_buffer = undefined,
.log2_ring_entries = options.log2_ring_entries,
.threads = .{
.allocated = @ptrCast(allocated_slice[0..threads_size]),
.reserved = 1,
.active = 1,
},
.sync_limit = if (options.sync_limit.toInt()) |sync_limit| .{ .permits = sync_limit } else null,
.stderr_writer_initialized = false,
.stderr_mutex = .init,
.stderr_writer = .{
.io = ev.io(),
.interface = Io.File.Writer.initInterface(&.{}),
.file = .stderr(),
.mode = .streaming,
},
.stderr_mode = .no_color,
.environ_mutex = .init,
.environ_initialized = options.environ.block.isEmpty(),
.environ = .{ .process_environ = options.environ },
.null_fd = .init,
.random_fd = .init,
.csprng_mutex = .init,
.csprng = .uninitialized,
};
const main_fiber: *Fiber = @ptrCast(&ev.main_fiber_buffer);
main_fiber.* = .{
.required_align = {},
.context = undefined,
.link = .{ .awaiter = null },
.status = .{ .queue_next = null },
.cancel_status = .unrequested,
.cancel_protection = .unblocked,
.name = if (tracy.enable) "main task",
};
const main_thread = &ev.threads.allocated[0];
Thread.self = main_thread;
main_thread.* = .{
.required_align = {},
.thread = undefined,
.idle_context = switch (builtin.cpu.arch) {
.aarch64 => .{
.sp = @intFromPtr(allocated_slice[idle_stack_end_offset..].ptr),
.fp = @intFromPtr(ev),
.pc = @intFromPtr(&mainIdleEntry),
},
.riscv64 => .{
.sp = @intFromPtr(allocated_slice[idle_stack_end_offset..].ptr),
.fp = @intFromPtr(ev),
.pc = @intFromPtr(&mainIdleEntry),
},
.x86_64 => .{
.rsp = @intFromPtr(allocated_slice[idle_stack_end_offset..].ptr),
.rbp = @intFromPtr(ev),
.rip = @intFromPtr(&mainIdleEntry),
},
else => @compileError("unimplemented architecture"),
},
.current_context = &main_fiber.context,
.ready_queue = null,
.free_queue = null,
.io_uring = try .init(
@as(u16, 1) << ev.log2_ring_entries,
linux.IORING_SETUP_COOP_TASKRUN | linux.IORING_SETUP_SINGLE_ISSUER,
),
.idle_search_index = 1,
.steal_ready_search_index = 1,
.steal_free_search_index = 1,
.name_arena = .{},
.csprng = .uninitialized,
};
errdefer main_thread.io_uring.deinit();
if (tracy.enable) tracy.fiberEnter(main_fiber.name);
}