authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-11 14:40:27+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-11 14:40:27+01:00
log2a65971eb07e649ae8072c274a5a8817b0e1ca1e
treeabac4084b4cbcec6ffa3655370512bd4c7ce09a0
parent35e3069ab7af0a5fd65c5fe8e35b01458dbcb132

darwin: wrap allocating and deallocating mach ports for a task


2 files changed, 41 insertions(+), 1 deletions(-)

lib/std/c/darwin.zig+21-1
......@@ -164,6 +164,21 @@ pub const mach_vm_address_t = usize;
164164pub const vm_offset_t = usize;
165165pub const mach_vm_size_t = u64;
166166pub const mach_msg_type_number_t = natural_t;
167pub const mach_port_right_t = natural_t;
168pub const ipc_space_t = mach_port_t;
169pub const ipc_space_port_t = ipc_space_t;
170
171pub const MACH_PORT_RIGHT = enum(mach_port_right_t) {
172 SEND = 0,
173 RECEIVE = 1,
174 SEND_ONCE = 2,
175 PORT_SET = 3,
176 DEAD_NAME = 4,
177 /// Obsolete right
178 LABELH = 5,
179 /// Right not implemented
180 NUMBER = 6,
181};
167182
168183extern "c" var mach_task_self_: mach_port_t;
169184pub fn mach_task_self() callconv(.C) mach_port_t {
......@@ -506,7 +521,12 @@ pub extern "c" fn mach_vm_protect(
506521 new_protection: vm_prot_t,
507522) kern_return_t;
508523
509pub extern "c" fn mach_port_deallocate(target_tport: mach_port_name_t, task: mach_port_name_t) kern_return_t;
524pub extern "c" fn mach_port_allocate(
525 task: ipc_space_t,
526 right: mach_port_right_t,
527 name: *mach_port_name_t,
528) kern_return_t;
529pub extern "c" fn mach_port_deallocate(task: ipc_space_t, name: mach_port_name_t) kern_return_t;
510530
511531pub extern "c" fn task_info(
512532 target_task: task_name_t,
lib/std/os/darwin.zig+20
......@@ -24,6 +24,26 @@ const mach_task = if (builtin.target.isDarwin()) struct {
2424 return self.port != 0;
2525 }
2626
27 pub fn allocatePort(self: MachTask, right: std.c.MACH_PORT_RIGHT) MachError!MachTask {
28 var out_port: std.c.mach_port_name_t = undefined;
29 switch (std.c.getKernError(std.c.mach_port_allocate(
30 self.port,
31 @enumToInt(right),
32 &out_port,
33 ))) {
34 .SUCCESS => return .{ .port = out_port },
35 .FAILURE => return error.PermissionDenied,
36 else => |err| {
37 log.err("mach_task_allocate kernel call failed with error code: {s}", .{@tagName(err)});
38 return error.Unexpected;
39 },
40 }
41 }
42
43 pub fn deallocatePort(self: MachTask, port: MachTask) void {
44 _ = std.c.getKernError(std.c.mach_port_deallocate(self.port, port.port));
45 }
46
2747 pub const RegionInfo = struct {
2848 pub const Tag = enum {
2949 basic,