authorgravatar for devnexen@gmail.comDavid Carlier <devnexen@gmail.com> 2023-05-13 21:25:15+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-14 10:21:42+03:00
log05268bb9677ef0545cca6c788169b2707842dc8d
treee97e926eb065c6853277d6c31d36fa44d65a2986
parent87de8212adac280780900f8a68c302c6bc127c47

std.os: implementing sched_setaffinity wrapper for freebsd


2 files changed, 44 insertions(+), 0 deletions(-)

lib/std/c/freebsd.zig+31
......@@ -18,10 +18,41 @@ fn __BIT_COUNT(bits: []const c_long) c_long {
1818 return count;
1919}
2020
21fn __BIT_MASK(s: usize) c_long {
22 var x = s % CPU_SETSIZE;
23 return @bitCast(c_long, @intCast(c_ulong, 1) << @intCast(u6, x));
24}
25
2126pub fn CPU_COUNT(set: cpuset_t) c_int {
2227 return @intCast(c_int, __BIT_COUNT(set.__bits[0..]));
2328}
2429
30pub fn CPU_ZERO(set: *cpuset_t) void {
31 @memset((set.*).__bits[0..], 0);
32}
33
34pub fn CPU_SET(cpu: usize, set: *cpuset_t) void {
35 const x = cpu / @sizeOf(c_long);
36 if (x < @sizeOf(cpuset_t)) {
37 (set.*).__bits[x] |= __BIT_MASK(x);
38 }
39}
40
41pub fn CPU_ISSET(cpu: usize, set: cpuset_t) void {
42 const x = cpu / @sizeOf(c_long);
43 if (x < @sizeOf(cpuset_t)) {
44 return set.__bits[x] & __BIT_MASK(x);
45 }
46 return false;
47}
48
49pub fn CPU_CLR(cpu: usize, set: *cpuset_t) void {
50 const x = cpu / @sizeOf(c_long);
51 if (x < @sizeOf(cpuset_t)) {
52 (set.*).__bits[x] &= !__BIT_MASK(x);
53 }
54}
55
2556pub const cpulevel_t = c_int;
2657pub const cpuwhich_t = c_int;
2758pub const id_t = i64;
lib/std/os.zig+13
......@@ -5573,6 +5573,19 @@ pub fn sched_setaffinity(pid: pid_t, cpus: []usize) SchedSetAffinityError!cpu_se
55735573 .PERM => return error.PermissionDenied,
55745574 else => |err| return unexpectedErrno(err),
55755575 }
5576 } else if (builtin.os.tag == .freebsd) {
5577 freebsd.CPU_ZERO(&set);
5578 for (cpus) |cpu| {
5579 freebsd.CPU_SET(cpu, &set);
5580 }
5581 switch (errno(freebsd.cpuset_setaffinity(freebsd.CPU_LEVEL_WHICH, freebsd.CPU_WHICH_PID, pid, @sizeOf(cpu_set_t), &set))) {
5582 .SUCCESS => return set,
5583 .FAULT => unreachable,
5584 .SRCH => unreachable,
5585 .INVAL => return error.InvalidCpu,
5586 .PERM => return error.PermissionDenied,
5587 else => |err| return unexpectedErrno(err),
5588 }
55765589 } else {
55775590 @compileError("unsupported platform");
55785591 }