Commit 37a1d08de2

Andrew Kelley <andrew@ziglang.org>
2021-02-26 00:54:32
haiku: minor fixups
* no isHaiku() function since there is not more than one os tag that this applies to. * clean up some control flow into a switch * add some TODO comments to investigate panics that suspiciously look like they should be compile errors (see #363)
1 parent 96a08c1
Changed files (3)
lib/std/os.zig
@@ -3892,7 +3892,7 @@ pub fn pipe2(flags: u32) PipeError![2]fd_t {
             }
         }
     }
-    if (comptime std.Target.current.isHaiku()) {
+    if (std.Target.current.os.tag == .haiku) {
         var fds: [2]fd_t = try pipe();
         if (flags == 0) return fds;
         errdefer {
@@ -3939,10 +3939,10 @@ pub fn sysctl(
     newlen: usize,
 ) SysCtlError!void {
     if (builtin.os.tag == .wasi) {
-        @panic("unsupported");
+        @panic("unsupported"); // TODO should be compile error, not panic
     }
     if (builtin.os.tag == .haiku) {
-        @panic("unsupported");
+        @panic("unsupported"); // TODO should be compile error, not panic
     }
 
     const name_len = math.cast(c_uint, name.len) catch return error.NameTooLong;
@@ -3966,10 +3966,10 @@ pub fn sysctlbynameZ(
     newlen: usize,
 ) SysCtlError!void {
     if (builtin.os.tag == .wasi) {
-        @panic("unsupported");
+        @panic("unsupported"); // TODO should be compile error, not panic
     }
     if (builtin.os.tag == .haiku) {
-        @panic("unsupported");
+        @panic("unsupported"); // TODO should be compile error, not panic
     }
 
     switch (errno(system.sysctlbyname(name, oldp, oldlenp, newp, newlen))) {
lib/std/target.zig
@@ -1339,10 +1339,6 @@ pub const Target = struct {
         return self.os.tag.isDarwin();
     }
 
-    pub fn isHaiku(self: Target) bool {
-        return self.os.tag == .haiku;
-    }
-
     pub fn isGnuLibC_os_tag_abi(os_tag: Os.Tag, abi: Abi) bool {
         return os_tag == .linux and abi.isGnu();
     }
lib/std/Thread.zig
@@ -487,38 +487,42 @@ pub const CpuCountError = error{
 };
 
 pub fn cpuCount() CpuCountError!usize {
-    if (std.Target.current.os.tag == .linux) {
-        const cpu_set = try os.sched_getaffinity(0);
-        return @as(usize, os.CPU_COUNT(cpu_set)); // TODO should not need this usize cast
-    }
-    if (std.Target.current.os.tag == .windows) {
-        return os.windows.peb().NumberOfProcessors;
-    }
-    if (std.Target.current.os.tag == .openbsd) {
-        var count: c_int = undefined;
-        var count_size: usize = @sizeOf(c_int);
-        const mib = [_]c_int{ os.CTL_HW, os.HW_NCPUONLINE };
-        os.sysctl(&mib, &count, &count_size, null, 0) catch |err| switch (err) {
-            error.NameTooLong, error.UnknownName => unreachable,
-            else => |e| return e,
-        };
-        return @intCast(usize, count);
-    }
-    if (std.Target.current.os.tag == .haiku) {
-        var count: u32 = undefined;
-        var system_info: os.system_info = undefined;
-        const rc = os.system.get_system_info(&system_info);
-        count = system_info.cpu_count;
-        return @intCast(usize, count);
+    switch (std.Target.current.os.tag) {
+        .linux => {
+            const cpu_set = try os.sched_getaffinity(0);
+            return @as(usize, os.CPU_COUNT(cpu_set)); // TODO should not need this usize cast
+        },
+        .windows => {
+            return os.windows.peb().NumberOfProcessors;
+        },
+        .openbsd => {
+            var count: c_int = undefined;
+            var count_size: usize = @sizeOf(c_int);
+            const mib = [_]c_int{ os.CTL_HW, os.HW_NCPUONLINE };
+            os.sysctl(&mib, &count, &count_size, null, 0) catch |err| switch (err) {
+                error.NameTooLong, error.UnknownName => unreachable,
+                else => |e| return e,
+            };
+            return @intCast(usize, count);
+        },
+        .haiku => {
+            var count: u32 = undefined;
+            var system_info: os.system_info = undefined;
+            const rc = os.system.get_system_info(&system_info);
+            count = system_info.cpu_count;
+            return @intCast(usize, count);
+        },
+        else => {
+            var count: c_int = undefined;
+            var count_len: usize = @sizeOf(c_int);
+            const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu";
+            os.sysctlbynameZ(name, &count, &count_len, null, 0) catch |err| switch (err) {
+                error.NameTooLong, error.UnknownName => unreachable,
+                else => |e| return e,
+            };
+            return @intCast(usize, count);
+        },
     }
-    var count: c_int = undefined;
-    var count_len: usize = @sizeOf(c_int);
-    const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu";
-    os.sysctlbynameZ(name, &count, &count_len, null, 0) catch |err| switch (err) {
-        error.NameTooLong, error.UnknownName => unreachable,
-        else => |e| return e,
-    };
-    return @intCast(usize, count);
 }
 
 pub fn getCurrentThreadId() u64 {