authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-13 15:29:49+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-13 15:29:49+01:00
logf5336a8fec10c5ac66b1ed804b908a01fd56d4fe
tree6e369a2e6bfaff0d4c917de323d2a4cc9ba2bdab
parentf505cb96f44e1739e3616fe2fb64bb84c44067e8

darwin: add ability to dealloc obtained thread list for a task


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

lib/std/os/darwin.zig+15-2
......@@ -439,11 +439,24 @@ const mach_task = if (builtin.target.isDarwin()) struct {
439439 }
440440 }
441441
442 pub fn getThreads(task: MachTask) MachError![]ThreadId {
442 const ThreadList = struct {
443 buf: []ThreadId,
444
445 pub fn deinit(list: ThreadList) void {
446 const self_task = machTaskForSelf();
447 _ = std.c.vm_deallocate(
448 self_task.port,
449 @ptrToInt(list.buf.ptr),
450 @intCast(std.c.vm_size_t, list.buf.len * @sizeOf(std.c.mach_port_t)),
451 );
452 }
453 };
454
455 pub fn getThreads(task: MachTask) MachError!ThreadList {
443456 var thread_list: std.c.mach_port_array_t = undefined;
444457 var thread_count: std.c.mach_msg_type_number_t = undefined;
445458 switch (std.c.getKernError(std.c.task_threads(task.port, &thread_list, &thread_count))) {
446 .SUCCESS => return @ptrCast([*]ThreadId, thread_list)[0..thread_count],
459 .SUCCESS => return ThreadList{ .buf = @ptrCast([*]ThreadId, thread_list)[0..thread_count] },
447460 else => |err| {
448461 log.err("task_threads kernel call failed with error code: {s}", .{@tagName(err)});
449462 return error.Unexpected;