From 6eba159ae63e9c3af57960a677388d91b571bcd2 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 3e88489de414..713cd3767cd2 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -6113,12 +6113,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 { tv_sec: i64, tv_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 { tv_sec: isize, tv_nsec: isize, };