From 2264fca03e6ce9203baf52d70825ec3bc32f8262 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 1 Sep 2021 17:51:22 -0700 Subject: [PATCH] fix regression on linux with kernel_timespec I incorrectly assumed that __kernel_timespec was used when not linking libc, however that is not the case. `std.os.timespec` is used both for libc and non-libc cases. `__kernel_timespec` is a special struct that is used only for io_uring. --- lib/std/os/linux.zig | 9 +++++++-- lib/std/os/linux/arm-eabi.zig | 6 +----- lib/std/os/linux/arm64.zig | 6 +----- lib/std/os/linux/i386.zig | 6 +----- lib/std/os/linux/io_uring.zig | 10 +++++----- lib/std/os/linux/mips.zig | 6 +----- lib/std/os/linux/powerpc.zig | 6 +----- lib/std/os/linux/powerpc64.zig | 6 +----- lib/std/os/linux/riscv64.zig | 5 +---- lib/std/os/linux/sparc64.zig | 6 +----- lib/std/os/linux/x86_64.zig | 6 +----- 11 files changed, 21 insertions(+), 51 deletions(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 12a8f3906e74a3cfb16f9a7afe5fcb6db01665aa..a5f49cda1c305a64bc06f059b7329f20415da0f2 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -81,7 +81,6 @@ pub const msghdr_const = arch_bits.msghdr_const; pub const nlink_t = arch_bits.nlink_t; pub const off_t = arch_bits.off_t; pub const time_t = arch_bits.time_t; -pub const timespec = arch_bits.timespec; pub const timeval = arch_bits.timeval; pub const timezone = arch_bits.timezone; pub const ucontext_t = arch_bits.ucontext_t; @@ -4149,11 +4148,17 @@ pub const POSIX_FADV = switch (native_arch) { }, }; -pub const __kernel_timespec = extern struct { +/// The timespec struct used by the kernel. +pub const kernel_timespec = if (@sizeOf(usize) >= 8) timespec else extern struct { tv_sec: i64, tv_nsec: i64, }; +pub const timespec = extern struct { + tv_sec: isize, + tv_nsec: isize, +}; + pub const XDP = struct { pub const SHARED_UMEM = (1 << 0); pub const COPY = (1 << 1); diff --git a/lib/std/os/linux/arm-eabi.zig b/lib/std/os/linux/arm-eabi.zig index 7727e2ff2f1bf8401b0c4eba2c92b643ef5783db..4bb60a000561388f9237f996c8529046d36b4278 100644 --- a/lib/std/os/linux/arm-eabi.zig +++ b/lib/std/os/linux/arm-eabi.zig @@ -10,6 +10,7 @@ const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; const sockaddr = linux.sockaddr; +const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ("svc #0" @@ -703,11 +704,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: i32, - tv_nsec: i32, -}; - pub const timeval = extern struct { tv_sec: i32, tv_usec: i32, diff --git a/lib/std/os/linux/arm64.zig b/lib/std/os/linux/arm64.zig index 7f0c2c12c5e3125520de8bf82c6437f1c9bff97d..58895843e08121113faf794321da5e4c237b651f 100644 --- a/lib/std/os/linux/arm64.zig +++ b/lib/std/os/linux/arm64.zig @@ -10,6 +10,7 @@ const gid_t = linux.gid_t; const pid_t = linux.pid_t; const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; +const timespec = std.os.linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ("svc #0" @@ -558,11 +559,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: time_t, - tv_nsec: isize, -}; - pub const timeval = extern struct { tv_sec: isize, tv_usec: isize, diff --git a/lib/std/os/linux/i386.zig b/lib/std/os/linux/i386.zig index eaa803768dd9c95e6f8026580eff33085193fa0e..4d1af88e0a7e0b104ad46e6c12b7b28ceff71ae4 100644 --- a/lib/std/os/linux/i386.zig +++ b/lib/std/os/linux/i386.zig @@ -10,6 +10,7 @@ const pid_t = linux.pid_t; const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; const sockaddr = linux.sockaddr; +const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ("int $0x80" @@ -710,11 +711,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: i32, - tv_nsec: i32, -}; - pub const timeval = extern struct { tv_sec: i32, tv_usec: i32, diff --git a/lib/std/os/linux/io_uring.zig b/lib/std/os/linux/io_uring.zig index 716137f43beb6b3f42524fa9db12c33213832cb6..a98ce009a96253c32eac0e2157b717816f386687 100644 --- a/lib/std/os/linux/io_uring.zig +++ b/lib/std/os/linux/io_uring.zig @@ -539,7 +539,7 @@ pub const IO_Uring = struct { pub fn timeout( self: *IO_Uring, user_data: u64, - ts: *const os.linux.timespec, + ts: *const os.linux.kernel_timespec, count: u32, flags: u32, ) !*io_uring_sqe { @@ -979,7 +979,7 @@ pub fn io_uring_prep_close(sqe: *io_uring_sqe, fd: os.fd_t) void { pub fn io_uring_prep_timeout( sqe: *io_uring_sqe, - ts: *const os.linux.timespec, + ts: *const os.linux.kernel_timespec, count: u32, flags: u32, ) void { @@ -1450,7 +1450,7 @@ test "timeout (after a relative time)" { const ms = 10; const margin = 5; - const ts = os.linux.timespec{ .tv_sec = 0, .tv_nsec = ms * 1000000 }; + const ts = os.linux.kernel_timespec{ .tv_sec = 0, .tv_nsec = ms * 1000000 }; const started = std.time.milliTimestamp(); const sqe = try ring.timeout(0x55555555, &ts, 0, 0); @@ -1479,7 +1479,7 @@ test "timeout (after a number of completions)" { }; defer ring.deinit(); - const ts = os.linux.timespec{ .tv_sec = 3, .tv_nsec = 0 }; + const ts = os.linux.kernel_timespec{ .tv_sec = 3, .tv_nsec = 0 }; const count_completions: u64 = 1; const sqe_timeout = try ring.timeout(0x66666666, &ts, count_completions, 0); try testing.expectEqual(linux.IORING_OP.TIMEOUT, sqe_timeout.opcode); @@ -1512,7 +1512,7 @@ test "timeout_remove" { }; defer ring.deinit(); - const ts = os.linux.timespec{ .tv_sec = 3, .tv_nsec = 0 }; + const ts = os.linux.kernel_timespec{ .tv_sec = 3, .tv_nsec = 0 }; const sqe_timeout = try ring.timeout(0x88888888, &ts, 0, 0); try testing.expectEqual(linux.IORING_OP.TIMEOUT, sqe_timeout.opcode); try testing.expectEqual(@as(u64, 0x88888888), sqe_timeout.user_data); diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig index 2cc5ed9eeb27794d91084142b18ede11166c5b11..b3697405f7b90a01bbb9078558fbd335bd05c250 100644 --- a/lib/std/os/linux/mips.zig +++ b/lib/std/os/linux/mips.zig @@ -7,6 +7,7 @@ const iovec_const = linux.iovec_const; const uid_t = linux.uid_t; const gid_t = linux.gid_t; const pid_t = linux.pid_t; +const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ( @@ -753,11 +754,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: isize, - tv_nsec: isize, -}; - pub const timeval = extern struct { tv_sec: isize, tv_usec: isize, diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig index e2473055d6cf056e02bba5445d04c52cce645305..30001c48c68d01792e56ce1968deb251ecd4a93c 100644 --- a/lib/std/os/linux/powerpc.zig +++ b/lib/std/os/linux/powerpc.zig @@ -10,6 +10,7 @@ const pid_t = linux.pid_t; const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; const sockaddr = linux.sockaddr; +const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ( @@ -704,11 +705,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: time_t, - tv_nsec: isize, -}; - pub const timeval = extern struct { tv_sec: time_t, tv_usec: isize, diff --git a/lib/std/os/linux/powerpc64.zig b/lib/std/os/linux/powerpc64.zig index 63c4e6a2d93df983a71add5ac60a82938de8ee70..2903df15ef7034f1d808c35ee9732fc32bbff21a 100644 --- a/lib/std/os/linux/powerpc64.zig +++ b/lib/std/os/linux/powerpc64.zig @@ -10,6 +10,7 @@ const pid_t = linux.pid_t; const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; const sockaddr = linux.sockaddr; +const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ( @@ -679,11 +680,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: time_t, - tv_nsec: isize, -}; - pub const timeval = extern struct { tv_sec: isize, tv_usec: isize, diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig index 424e6bc3de8cad6fafa92d41e076ab4d1f836976..be78a1bf4e3d912b00e3e483682495d2f1959269 100644 --- a/lib/std/os/linux/riscv64.zig +++ b/lib/std/os/linux/riscv64.zig @@ -2,6 +2,7 @@ const std = @import("../../std.zig"); const uid_t = std.os.linux.uid_t; const gid_t = std.os.linux.gid_t; const pid_t = std.os.linux.pid_t; +const timespec = std.os.linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ("ecall" @@ -468,10 +469,6 @@ pub const off_t = isize; pub const ino_t = usize; pub const dev_t = usize; pub const blkcnt_t = isize; -pub const timespec = extern struct { - tv_sec: time_t, - tv_nsec: isize, -}; pub const timeval = extern struct { tv_sec: time_t, diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index e3e32b659b4fc8e22d4d419d979624aa4a08943f..3ae490f5e97a5cf947236d36e9ed24e00a6ef8dc 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -11,6 +11,7 @@ const sockaddr = linux.sockaddr; const socklen_t = linux.socklen_t; const iovec = linux.iovec; const iovec_const = linux.iovec_const; +const timespec = linux.timespec; pub fn syscall_pipe(fd: *[2]i32) usize { return asm volatile ( @@ -708,11 +709,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: isize, - tv_nsec: isize, -}; - pub const timeval = extern struct { tv_sec: isize, tv_usec: isize, diff --git a/lib/std/os/linux/x86_64.zig b/lib/std/os/linux/x86_64.zig index 1a50fb14c6c8d30e470090ac022ee268ec197ec7..b6a2d2763f735005ac02e50b19abddd55186e7a8 100644 --- a/lib/std/os/linux/x86_64.zig +++ b/lib/std/os/linux/x86_64.zig @@ -12,6 +12,7 @@ const stack_t = linux.stack_t; const sigset_t = linux.sigset_t; const sockaddr = linux.sockaddr; const socklen_t = linux.socklen_t; +const timespec = linux.timespec; pub fn syscall0(number: SYS) usize { return asm volatile ("syscall" @@ -653,11 +654,6 @@ pub const Stat = extern struct { } }; -pub const timespec = extern struct { - tv_sec: isize, - tv_nsec: isize, -}; - pub const timeval = extern struct { tv_sec: isize, tv_usec: isize, -- 2.54.0