commit b0570b807ff24a41d5080fe090c4e12f423dd78d (tree)
parent 1face9ad781f3e162c709da0cab38391707b9696
Author: Andrew Kelley <andrew@ziglang.org>
Date: Thu, 8 Jan 2026 21:00:36 +0100
Merge pull request 'std.Io.Threaded: clock_nanosleep is not linux-only' (#30746) from clock_nanosleep into master
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/30746
Diffstat:
2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig
@@ -9664,14 +9664,12 @@ fn nowWasi(clock: Io.Clock) Io.Clock.Error!Io.Timestamp {
fn sleep(userdata: ?*anyopaque, timeout: Io.Timeout) Io.SleepError!void {
const t: *Threaded = @ptrCast(@alignCast(userdata));
if (use_parking_sleep) return parking_sleep.sleep(timeout);
- switch (native_os) {
- .wasi => return sleepWasi(t, timeout),
- .linux => return sleepLinux(timeout),
- else => return sleepPosix(t, timeout),
- }
+ if (native_os == .wasi) return sleepWasi(t, timeout);
+ if (@TypeOf(posix.system.clock_nanosleep) != void) return sleepPosix(timeout);
+ return sleepNanosleep(t, timeout);
}
-fn sleepLinux(timeout: Io.Timeout) Io.SleepError!void {
+fn sleepPosix(timeout: Io.Timeout) Io.SleepError!void {
const clock_id: posix.clockid_t = clockToPosix(switch (timeout) {
.none => .awake,
.duration => |d| d.clock,
@@ -9685,7 +9683,7 @@ fn sleepLinux(timeout: Io.Timeout) Io.SleepError!void {
var timespec: posix.timespec = timestampToPosix(deadline_nanoseconds);
const syscall: Syscall = try .start();
while (true) {
- switch (std.os.linux.errno(std.os.linux.clock_nanosleep(clock_id, .{ .ABSTIME = switch (timeout) {
+ switch (posix.errno(posix.system.clock_nanosleep(clock_id, .{ .ABSTIME = switch (timeout) {
.none, .duration => false,
.deadline => true,
} }, ×pec, ×pec))) {
@@ -9737,7 +9735,7 @@ fn sleepWasi(t: *Threaded, timeout: Io.Timeout) Io.SleepError!void {
syscall.finish();
}
-fn sleepPosix(t: *Threaded, timeout: Io.Timeout) Io.SleepError!void {
+fn sleepNanosleep(t: *Threaded, timeout: Io.Timeout) Io.SleepError!void {
const t_io = ioBasic(t);
const sec_type = @typeInfo(posix.timespec).@"struct".fields[0].type;
const nsec_type = @typeInfo(posix.timespec).@"struct".fields[1].type;
diff --git a/lib/std/c.zig b/lib/std/c.zig
@@ -10588,7 +10588,7 @@ pub const socket = switch (native_os) {
pub const socketpair = switch (native_os) {
// https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/#unsupported\unavailable:
- .windows => void,
+ .windows => {},
else => private.socketpair,
};
@@ -10775,11 +10775,10 @@ pub extern "c" fn recvfrom(
) if (native_os == .windows) c_int else isize;
pub const recvmsg = switch (native_os) {
- // Windows: Technically, a form of recvmsg() exists for Windows, but the
- // user has to install some kind of callback for it. I'm not sure if/how
- // we can map this to normal recvmsg() interface use.
+ // Technically, a form of recvmsg() exists for Windows, but the user has to
+ // install some kind of callback for it.
// https://learn.microsoft.com/en-us/windows/win32/api/mswsock/nc-mswsock-lpfn_wsarecvmsg
- .windows => void,
+ .windows => {},
else => private.recvmsg,
};
@@ -11087,6 +11086,20 @@ pub extern "c" fn pthread_getthreadid_np() c_int;
pub extern "c" fn pthread_set_name_np(thread: pthread_t, name: [*:0]const u8) void;
pub extern "c" fn pthread_get_name_np(thread: pthread_t, name: [*:0]u8, len: usize) void;
+pub const TIMER = switch (native_os) {
+ .linux, .emscripten => std.os.linux.TIMER,
+ .openbsd, .netbsd, .wasi, .windows, .freebsd => packed struct(u32) {
+ ABSTIME: bool,
+ _: u31 = 0,
+ },
+ else => void,
+};
+
+pub const clock_nanosleep = switch (native_os) {
+ .linux, .emscripten, .netbsd, .wasi, .windows, .freebsd => private.clock_nanosleep,
+ else => {},
+};
+
// OS-specific bits. These are protected from being used on the wrong OS by
// comptime assertions inside each OS-specific file.
@@ -11476,6 +11489,7 @@ const private = struct {
extern "c" fn gettimeofday(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int;
extern "c" fn msync(addr: *align(page_size) const anyopaque, len: usize, flags: c_int) c_int;
extern "c" fn nanosleep(rqtp: *const timespec, rmtp: ?*timespec) c_int;
+ extern "c" fn clock_nanosleep(clockid: clockid_t, flags: TIMER, t: *const timespec, remain: ?*timespec) c_int;
extern "c" fn pipe2(fds: *[2]fd_t, flags: O) c_int;
extern "c" fn readdir(dir: *DIR) ?*dirent;
extern "c" fn realpath(noalias file_name: [*:0]const u8, noalias resolved_name: [*]u8) ?[*:0]u8;