From 9d1662ebb07e533db6ac68c1986e3d242c8d5de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Wed, 26 Jun 2024 02:48:03 +0200 Subject: [PATCH] std.os.linux: Define timespec as kernel_timespec (64-bit) for riscv32. This is kind of a hack because the timespec in UAPI headers is actually still 32-bit while __kernel_timespec is 64-bit. But, importantly, all the syscalls take __kernel_timespec from the get-go (because riscv32 support is so recent). Defining our timespec this way will allow all the syscall wrappers in std.os.linux to do the right thing for riscv32. For other 32-bit architectures, we have to use the 64-bit time syscalls explicitly to solve the Y2038 problem. See issue #4726 for that. --- lib/std/os/linux.zig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index cf5846caad0d..b23e0311ad6e 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -6267,12 +6267,13 @@ pub const POSIX_FADV = switch (native_arch) { }; /// The timespec struct used by the kernel. -pub const kernel_timespec = if (@sizeOf(usize) >= 8) timespec else extern struct { +pub const kernel_timespec = extern struct { sec: i64, nsec: i64, }; -pub const timespec = extern struct { +// TODO: This is a temporary hack until we figure out a coherent Y2038 strategy. +pub const timespec = if (!builtin.link_libc and native_arch == .riscv32) kernel_timespec else extern struct { sec: isize, nsec: isize, };