feature. See also
. The project being documented here (as the example) is the Zig library itself.
Dispatch.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 queue = c.dispatch.queue_create_with_target(
"org.ziglang.std.Io.Dispatch",
.CONCURRENT(),
options.target_queue,
) orelse return error.SystemResources;
errdefer queue.as_object().release();
const main_loop_stack = try backing_allocator.alignedAlloc(
u8,
.fromByteUnits(builtin.target.stackAlignment()),
main_loop_stack_size,
);
errdefer backing_allocator.free(main_loop_stack);
const exit_semaphore = c.dispatch.semaphore_create(0) orelse return error.SystemResources;
errdefer exit_semaphore.as_object().release();
ev.* = .{
.queue = queue,
.backing_allocator_needs_mutex = options.backing_allocator_needs_mutex,
.backing_allocator_mutex = undefined,
.backing_allocator = backing_allocator,
.main_fiber = .{
.required_align = {},
.evented = ev,
.context = undefined,
.link = .{ .awaiter = null },
.awaiting_group = undefined,
.cancel_status = .unrequested,
.cancel_protection = .unblocked,
},
.main_loop_stack = main_loop_stack.ptr,
.exit_semaphore = exit_semaphore,
.use_fcopyfile = .default,
.use_sendfile = .default,
.leeway = std.math.lossyCast(u64, options.leeway.toNanoseconds()),
.futexes = undefined,
.init_stderr_writer = .init,
.stderr_mutex = undefined,
.stderr_writer = .{
.io = ev.io(),
.interface = Io.File.Writer.initInterface(&.{}),
.file = .stderr(),
.mode = .streaming,
},
.stderr_mode = .no_color,
.scan_environ = if (options.environ.block.isEmpty()) .done else .init,
.environ = .{ .process_environ = options.environ },
.open_dev_null = .init,
.dev_null_file = error.FileNotFound,
.csprng_mutex = undefined,
.csprng = .uninitialized,
};
try ev.backing_allocator_mutex.init(queue);
errdefer ev.backing_allocator_mutex.deinit();
var initialized_futexes: usize = 0;
errdefer for (ev.futexes[0..initialized_futexes]) |*futex| futex.deinit();
for (&ev.futexes) |*futex| {
try futex.init(queue);
initialized_futexes += 1;
}
try ev.stderr_mutex.init(queue);
errdefer ev.stderr_mutex.deinit();
try ev.csprng_mutex.init(queue);
errdefer ev.csprng_mutex.deinit();
const thread: *Thread = .current();
thread.main_context = switch (builtin.cpu.arch) {
.aarch64 => .{
.sp = @intFromPtr(main_loop_stack[main_loop_stack_size..].ptr),
.fp = @intFromPtr(ev),
.pc = @intFromPtr(&mainLoopEntry),
},
.x86_64 => .{
.rsp = @intFromPtr(main_loop_stack[main_loop_stack_size..].ptr) - 8,
.rbp = @intFromPtr(ev),
.rip = @intFromPtr(&mainLoopEntry),
},
else => |arch| @compileError("unimplemented architecture: " ++ @tagName(arch)),
};
thread.current_context = &ev.main_fiber.context;
}