mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #109784 - beetrees:riscv32-time64, r=cuviper
Refactor glibc time64 support, riscv32 always has 64-bit `time_t` Refactor existing support for 64-bit `time_t` on 32-bit glibc platforms, as riscv32 `time_t` is 64-bit by default. Split out of #109773.
This commit is contained in:
commit
0708fbf5cb
@ -174,6 +174,34 @@ impl From<libc::timespec> for Timespec {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
target_os = "linux",
|
||||
target_env = "gnu",
|
||||
target_pointer_width = "32",
|
||||
not(target_arch = "riscv32")
|
||||
))]
|
||||
#[repr(C)]
|
||||
pub(in crate::sys::unix) struct __timespec64 {
|
||||
pub(in crate::sys::unix) tv_sec: i64,
|
||||
#[cfg(target_endian = "big")]
|
||||
_padding: i32,
|
||||
pub(in crate::sys::unix) tv_nsec: i32,
|
||||
#[cfg(target_endian = "little")]
|
||||
_padding: i32,
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
target_os = "linux",
|
||||
target_env = "gnu",
|
||||
target_pointer_width = "32",
|
||||
not(target_arch = "riscv32")
|
||||
))]
|
||||
impl From<__timespec64> for Timespec {
|
||||
fn from(t: __timespec64) -> Timespec {
|
||||
Timespec::new(t.tv_sec, t.tv_nsec.into())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(
|
||||
all(target_os = "macos", any(not(target_arch = "aarch64"))),
|
||||
target_os = "ios",
|
||||
@ -352,29 +380,23 @@ mod inner {
|
||||
impl Timespec {
|
||||
pub fn now(clock: libc::clockid_t) -> Timespec {
|
||||
// Try to use 64-bit time in preparation for Y2038.
|
||||
#[cfg(all(target_os = "linux", target_env = "gnu", target_pointer_width = "32"))]
|
||||
#[cfg(all(
|
||||
target_os = "linux",
|
||||
target_env = "gnu",
|
||||
target_pointer_width = "32",
|
||||
not(target_arch = "riscv32")
|
||||
))]
|
||||
{
|
||||
use crate::sys::weak::weak;
|
||||
|
||||
// __clock_gettime64 was added to 32-bit arches in glibc 2.34,
|
||||
// and it handles both vDSO calls and ENOSYS fallbacks itself.
|
||||
weak!(fn __clock_gettime64(libc::clockid_t, *mut __timespec64) -> libc::c_int);
|
||||
|
||||
#[repr(C)]
|
||||
struct __timespec64 {
|
||||
tv_sec: i64,
|
||||
#[cfg(target_endian = "big")]
|
||||
_padding: i32,
|
||||
tv_nsec: i32,
|
||||
#[cfg(target_endian = "little")]
|
||||
_padding: i32,
|
||||
}
|
||||
weak!(fn __clock_gettime64(libc::clockid_t, *mut super::__timespec64) -> libc::c_int);
|
||||
|
||||
if let Some(clock_gettime64) = __clock_gettime64.get() {
|
||||
let mut t = MaybeUninit::uninit();
|
||||
cvt(unsafe { clock_gettime64(clock, t.as_mut_ptr()) }).unwrap();
|
||||
let t = unsafe { t.assume_init() };
|
||||
return Timespec::new(t.tv_sec, t.tv_nsec as i64);
|
||||
return Timespec::from(unsafe { t.assume_init() });
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user