From 1191d8e1b4bedd677880a51f86c1227c15043ef4 Mon Sep 17 00:00:00 2001 From: auronandace Date: Thu, 12 Feb 2026 13:07:24 +0000 Subject: [PATCH 1/5] extract timespec to a bits header --- src/header/_aio/mod.rs | 4 +- src/header/bits_time/cbindgen.toml | 25 +++++++++++ src/header/bits_time/mod.rs | 68 +++++++++++++++++++++++++++++ src/header/mod.rs | 1 + src/header/netdb/lookup.rs | 3 +- src/header/poll/cbindgen.toml | 8 ++-- src/header/poll/mod.rs | 2 +- src/header/pthread/cbindgen.toml | 1 - src/header/pthread/mod.rs | 2 +- src/header/sched/cbindgen.toml | 5 ++- src/header/sched/mod.rs | 2 +- src/header/semaphore/cbindgen.toml | 8 ++-- src/header/semaphore/mod.rs | 5 ++- src/header/signal/cbindgen.toml | 8 ++-- src/header/signal/mod.rs | 2 +- src/header/sys_stat/cbindgen.toml | 10 ++--- src/header/sys_stat/mod.rs | 2 +- src/header/sys_time/cbindgen.toml | 5 ++- src/header/sys_time/mod.rs | 2 +- src/header/time/cbindgen.toml | 1 + src/header/time/mod.rs | 69 ++---------------------------- src/header/unistd/mod.rs | 2 +- src/header/utime/mod.rs | 2 +- src/platform/linux/mod.rs | 2 +- src/platform/linux/signal.rs | 2 +- src/platform/pal/mod.rs | 3 +- src/platform/pal/signal.rs | 2 +- src/platform/redox/mod.rs | 3 +- src/platform/redox/signal.rs | 2 +- src/sync/cond.rs | 3 +- src/sync/mod.rs | 2 +- src/sync/pthread_mutex.rs | 2 +- src/sync/rwlock.rs | 2 +- src/sync/semaphore.rs | 5 ++- 34 files changed, 157 insertions(+), 108 deletions(-) create mode 100644 src/header/bits_time/cbindgen.toml create mode 100644 src/header/bits_time/mod.rs diff --git a/src/header/_aio/mod.rs b/src/header/_aio/mod.rs index 99e6859b1f..9e32636f74 100644 --- a/src/header/_aio/mod.rs +++ b/src/header/_aio/mod.rs @@ -1,6 +1,6 @@ use crate::{ - header::{signal::sigevent, time::timespec}, - platform::types::*, + header::{bits_time::timespec, signal::sigevent}, + platform::types::{c_int, c_void}, }; pub struct aiocb { diff --git a/src/header/bits_time/cbindgen.toml b/src/header/bits_time/cbindgen.toml new file mode 100644 index 0000000000..2dbd877825 --- /dev/null +++ b/src/header/bits_time/cbindgen.toml @@ -0,0 +1,25 @@ +# POSIX header spec: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/time.h.html +# +# The time header should define timespec but multiple headers make use of it. +# This type is split out from the time header to avoid including all of time in the other headers. +# +# POSIX headers that require timespec: +# - aio.h (all functions currently unimplemented but timespec imported) +# - poll.h +# - sched.h +# - semaphore.h +# - signal.h +# - sys/select.h (not currently imported, needed for pselect, no TODO) +# - sys/stat.h +# - sys/time.h +include_guard = "_RELIBC_BITS_TIME_H" +language = "C" +style = "Tag" +no_includes = true +cpp_compat = true + +[export.rename] +"timespec" = "struct timespec" + +[enum] +prefix_with_name = true diff --git a/src/header/bits_time/mod.rs b/src/header/bits_time/mod.rs new file mode 100644 index 0000000000..c5f31b07f5 --- /dev/null +++ b/src/header/bits_time/mod.rs @@ -0,0 +1,68 @@ +use crate::{ + header::time::NANOSECONDS, + platform::types::{c_long, time_t}, +}; + +/// See . +#[repr(C)] +#[derive(Clone, Copy, Default, Debug)] +pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: c_long, +} + +impl timespec { + // TODO: Write test + + /// similar logic with timeradd + pub fn add(base: timespec, interval: timespec) -> Option { + let Some(delta_sec) = base.tv_sec.checked_add(interval.tv_sec) else { + return None; + }; + let Some(delta_nsec) = base.tv_nsec.checked_add(interval.tv_nsec) else { + return None; + }; + + if delta_sec < 0 || delta_nsec < 0 { + return None; + } + + Some(Self { + tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t, + tv_nsec: delta_nsec % NANOSECONDS, + }) + } + /// similar logic with timersub + pub fn subtract(later: timespec, earlier: timespec) -> Option { + let Some(delta_sec) = later.tv_sec.checked_sub(earlier.tv_sec) else { + return None; + }; + let Some(delta_nsec) = later.tv_nsec.checked_sub(earlier.tv_nsec) else { + return None; + }; + + let time = if delta_nsec < 0 { + let roundup_sec = -delta_nsec / NANOSECONDS + 1; + timespec { + tv_sec: delta_sec - (roundup_sec as time_t), + tv_nsec: roundup_sec * NANOSECONDS - delta_nsec, + } + } else { + timespec { + tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t, + tv_nsec: delta_nsec % NANOSECONDS, + } + }; + + if time.tv_sec < 0 { + // https://man7.org/linux/man-pages/man2/settimeofday.2.html + // caller should return EINVAL + return None; + } + + Some(time) + } + pub fn is_default(&self) -> bool { + return self.tv_nsec == 0 && self.tv_sec == 0; + } +} diff --git a/src/header/mod.rs b/src/header/mod.rs index df14b5be2f..1f37a9824c 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -10,6 +10,7 @@ pub mod bits_pthread; pub mod bits_sched; #[path = "bits_socklen-t/mod.rs"] pub mod bits_socklen_t; +pub mod bits_time; // complex.h implemented in C // cpio.h implemented in C pub mod crypt; diff --git a/src/header/netdb/lookup.rs b/src/header/netdb/lookup.rs index 7c8e405aaa..b0ffb18a4f 100644 --- a/src/header/netdb/lookup.rs +++ b/src/header/netdb/lookup.rs @@ -10,6 +10,7 @@ use crate::{ }; use crate::header::{ + bits_time::timespec, errno::*, netinet_in::{IPPROTO_UDP, htons, in_addr, sockaddr_in}, sys_socket::{ @@ -17,7 +18,7 @@ use crate::header::{ constants::{AF_INET, SOCK_DGRAM}, sockaddr, socklen_t, }, - time::{self, timespec}, + time, }; use super::{ diff --git a/src/header/poll/cbindgen.toml b/src/header/poll/cbindgen.toml index 017e287646..d623b3a811 100644 --- a/src/header/poll/cbindgen.toml +++ b/src/header/poll/cbindgen.toml @@ -1,5 +1,8 @@ -sys_includes = ["signal.h", "time.h"] +sys_includes = ["signal.h"] include_guard = "_RELIBC_POLL_H" +after_includes = """ +#include // for timespec +""" language = "C" style = "Tag" no_includes = true @@ -7,6 +10,3 @@ cpp_compat = true [enum] prefix_with_name = true - -[export.rename] -"timespec" = "struct timespec" diff --git a/src/header/poll/mod.rs b/src/header/poll/mod.rs index f71d2135a4..72edb26701 100644 --- a/src/header/poll/mod.rs +++ b/src/header/poll/mod.rs @@ -7,6 +7,7 @@ use core::{mem, ptr, slice}; use crate::{ fs::File, header::{ + bits_time::timespec, errno::EBADF, signal::sigset_t, sys_epoll::{ @@ -14,7 +15,6 @@ use crate::{ EPOLLPRI, EPOLLRDBAND, EPOLLRDNORM, EPOLLWRBAND, EPOLLWRNORM, epoll_create1, epoll_ctl, epoll_data, epoll_event, epoll_pwait, }, - time::timespec, }, platform::{ self, diff --git a/src/header/pthread/cbindgen.toml b/src/header/pthread/cbindgen.toml index 90ed503f46..17d5b58674 100644 --- a/src/header/pthread/cbindgen.toml +++ b/src/header/pthread/cbindgen.toml @@ -7,7 +7,6 @@ cpp_compat = true [export.rename] "sched_param" = "struct sched_param" -"timespec" = "struct timespec" [enum] prefix_with_name = true diff --git a/src/header/pthread/mod.rs b/src/header/pthread/mod.rs index ecd5015735..62774a0b9d 100644 --- a/src/header/pthread/mod.rs +++ b/src/header/pthread/mod.rs @@ -7,7 +7,7 @@ use core::{cell::Cell, ptr::NonNull}; use crate::{ error::Errno, - header::{sched::*, time::timespec}, + header::{bits_time::timespec, sched::*}, platform::{ Pal, Sys, types::{ diff --git a/src/header/sched/cbindgen.toml b/src/header/sched/cbindgen.toml index f6ba5253b3..39dfb744db 100644 --- a/src/header/sched/cbindgen.toml +++ b/src/header/sched/cbindgen.toml @@ -1,5 +1,8 @@ -sys_includes = ["time.h", "bits/sched.h"] +sys_includes = ["sys/types.h", "bits/sched.h"] include_guard = "_RELIBC_SCHED_H" +after_includes = """ +#include // for timespec +""" language = "C" style = "Tag" no_includes = true diff --git a/src/header/sched/mod.rs b/src/header/sched/mod.rs index f72f213791..237f7cb3ad 100644 --- a/src/header/sched/mod.rs +++ b/src/header/sched/mod.rs @@ -4,7 +4,7 @@ use crate::{ error::ResultExt, - header::time::timespec, + header::bits_time::timespec, platform::{ Pal, Sys, types::{c_int, pid_t}, diff --git a/src/header/semaphore/cbindgen.toml b/src/header/semaphore/cbindgen.toml index 8965814bf7..0bb0fb24ce 100644 --- a/src/header/semaphore/cbindgen.toml +++ b/src/header/semaphore/cbindgen.toml @@ -1,5 +1,8 @@ -sys_includes = ["time.h"] +sys_includes = [] include_guard = "_RELIBC_SEMAPHORE_H" +after_includes = """ +#include // for timespec +""" language = "C" style = "Type" no_includes = true @@ -7,6 +10,3 @@ cpp_compat = true [enum] prefix_with_name = true - -[export.rename] -"timespec" = "struct timespec" diff --git a/src/header/semaphore/mod.rs b/src/header/semaphore/mod.rs index 59d94f84ca..973b7dee74 100644 --- a/src/header/semaphore/mod.rs +++ b/src/header/semaphore/mod.rs @@ -3,7 +3,10 @@ //! See . use crate::{ - header::time::{CLOCK_MONOTONIC, CLOCK_REALTIME, timespec}, + header::{ + bits_time::timespec, + time::{CLOCK_MONOTONIC, CLOCK_REALTIME}, + }, platform::types::{c_char, c_int, c_long, c_uint, clockid_t}, }; diff --git a/src/header/signal/cbindgen.toml b/src/header/signal/cbindgen.toml index f1b6b51709..8eb7d42591 100644 --- a/src/header/signal/cbindgen.toml +++ b/src/header/signal/cbindgen.toml @@ -1,6 +1,9 @@ -sys_includes = ["bits/signal.h", "stdint.h", "sys/types.h", "time.h", "bits/pthread.h", "features.h"] +sys_includes = ["bits/signal.h", "stdint.h", "sys/types.h", "bits/pthread.h", "features.h"] include_guard = "_RELIBC_SIGNAL_H" -trailer = "#include " +after_includes = """ +#include // for timespec +#include +""" language = "C" style = "Tag" no_includes = true @@ -10,5 +13,4 @@ cpp_compat = true prefix_with_name = true [export.rename] -"timespec" = "struct timespec" "sigaction" = "struct sigaction" diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs index 0f79e439af..3f73906225 100644 --- a/src/header/signal/mod.rs +++ b/src/header/signal/mod.rs @@ -8,7 +8,7 @@ use cbitset::BitSet; use crate::{ error::{Errno, ResultExt}, - header::{errno, setjmp, time::timespec}, + header::{bits_time::timespec, errno, setjmp}, platform::{ self, ERRNO, Pal, PalSignal, Sys, types::{ diff --git a/src/header/sys_stat/cbindgen.toml b/src/header/sys_stat/cbindgen.toml index 345db1f4ed..7cd8feee2b 100644 --- a/src/header/sys_stat/cbindgen.toml +++ b/src/header/sys_stat/cbindgen.toml @@ -1,6 +1,9 @@ -sys_includes = ["sys/types.h", "time.h"] +sys_includes = ["sys/types.h"] include_guard = "_SYS_STAT_H" -trailer = "#include " +after_includes = """ +#include // for timespec +#include +""" language = "C" style = "Tag" no_includes = true @@ -8,6 +11,3 @@ cpp_compat = true [enum] prefix_with_name = true - -[export.rename] -"timespec" = "struct timespec" diff --git a/src/header/sys_stat/mod.rs b/src/header/sys_stat/mod.rs index c9f559726d..3bca4c05d0 100644 --- a/src/header/sys_stat/mod.rs +++ b/src/header/sys_stat/mod.rs @@ -6,8 +6,8 @@ use crate::{ c_str::CStr, error::ResultExt, header::{ + bits_time::timespec, fcntl::{O_NOFOLLOW, O_PATH}, - time::timespec, }, out::Out, platform::{ diff --git a/src/header/sys_time/cbindgen.toml b/src/header/sys_time/cbindgen.toml index 5d8bf0b6a6..1815e8c0a1 100644 --- a/src/header/sys_time/cbindgen.toml +++ b/src/header/sys_time/cbindgen.toml @@ -1,7 +1,10 @@ sys_includes = ["sys/types.h", "features.h", "sys/select.h"] include_guard = "_SYS_TIME_H" language = "C" -trailer = "#include " +after_includes = """ +#include // for timespec +#include +""" style = "Tag" no_includes = true cpp_compat = true diff --git a/src/header/sys_time/mod.rs b/src/header/sys_time/mod.rs index 6b9a36c64b..940b0c9c04 100644 --- a/src/header/sys_time/mod.rs +++ b/src/header/sys_time/mod.rs @@ -5,7 +5,7 @@ use crate::{ c_str::CStr, error::ResultExt, - header::{sys_select::timeval, time::timespec}, + header::{bits_time::timespec, sys_select::timeval}, out::Out, platform::{ Pal, PalSignal, Sys, diff --git a/src/header/time/cbindgen.toml b/src/header/time/cbindgen.toml index a71cdf3052..a09b92ed85 100644 --- a/src/header/time/cbindgen.toml +++ b/src/header/time/cbindgen.toml @@ -5,6 +5,7 @@ style = "Tag" no_includes = true cpp_compat = true after_includes = """ +#include // for timespec struct sigevent; """ diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs index 266752065a..fea11a453f 100644 --- a/src/header/time/mod.rs +++ b/src/header/time/mod.rs @@ -6,6 +6,7 @@ use crate::{ c_str::{CStr, CString}, error::{Errno, ResultExt}, header::{ + bits_time::timespec, errno::{EFAULT, ENOMEM, EOVERFLOW, ETIMEDOUT}, signal::sigevent, stdlib::getenv, @@ -26,7 +27,7 @@ use chrono::{ offset::MappedLocalTime, }; use chrono_tz::{OffsetComponents, OffsetName, Tz}; -use core::{cell::OnceCell, convert::TryFrom, fmt::Debug, mem, ptr}; +use core::{cell::OnceCell, convert::TryFrom, mem, ptr}; pub use self::constants::*; @@ -39,73 +40,9 @@ pub use strptime::strptime; const YEARS_PER_ERA: time_t = 400; const DAYS_PER_ERA: time_t = 146097; const SECS_PER_DAY: time_t = 24 * 60 * 60; -const NANOSECONDS: c_long = 1_000_000_000; +pub(crate) const NANOSECONDS: c_long = 1_000_000_000; const UTC_STR: &core::ffi::CStr = c"UTC"; -/// See . -#[repr(C)] -#[derive(Clone, Copy, Default, Debug)] -pub struct timespec { - pub tv_sec: time_t, - pub tv_nsec: c_long, -} - -impl timespec { - // TODO: Write test - - /// similar logic with timeradd - pub fn add(base: timespec, interval: timespec) -> Option { - let Some(delta_sec) = base.tv_sec.checked_add(interval.tv_sec) else { - return None; - }; - let Some(delta_nsec) = base.tv_nsec.checked_add(interval.tv_nsec) else { - return None; - }; - - if delta_sec < 0 || delta_nsec < 0 { - return None; - } - - Some(Self { - tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t, - tv_nsec: delta_nsec % NANOSECONDS, - }) - } - /// similar logic with timersub - pub fn subtract(later: timespec, earlier: timespec) -> Option { - let Some(delta_sec) = later.tv_sec.checked_sub(earlier.tv_sec) else { - return None; - }; - let Some(delta_nsec) = later.tv_nsec.checked_sub(earlier.tv_nsec) else { - return None; - }; - - let time = if delta_nsec < 0 { - let roundup_sec = -delta_nsec / NANOSECONDS + 1; - timespec { - tv_sec: delta_sec - (roundup_sec as time_t), - tv_nsec: roundup_sec * NANOSECONDS - delta_nsec, - } - } else { - timespec { - tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t, - tv_nsec: delta_nsec % NANOSECONDS, - } - }; - - if time.tv_sec < 0 { - // https://man7.org/linux/man-pages/man2/settimeofday.2.html - // caller should return EINVAL - return None; - } - - Some(time) - } - pub fn is_default(&self) -> bool { - return self.tv_nsec == 0 && self.tv_sec == 0; - } -} - #[cfg(target_os = "redox")] impl<'a> From<&'a timespec> for syscall::TimeSpec { fn from(tp: ×pec) -> Self { diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index e7114e2d59..d64255d128 100644 --- a/src/header/unistd/mod.rs +++ b/src/header/unistd/mod.rs @@ -13,6 +13,7 @@ use crate::{ c_str::CStr, error::{Errno, ResultExt}, header::{ + bits_time::timespec, crypt::{crypt_data, crypt_r}, errno::{self, ENAMETOOLONG}, fcntl, limits, @@ -20,7 +21,6 @@ use crate::{ sys_ioctl, sys_resource, sys_select::timeval, sys_time, sys_utsname, termios, - time::timespec, }, out::Out, platform::{ diff --git a/src/header/utime/mod.rs b/src/header/utime/mod.rs index 97ce28bf51..93a97e27e1 100644 --- a/src/header/utime/mod.rs +++ b/src/header/utime/mod.rs @@ -8,7 +8,7 @@ use crate::{ c_str::CStr, error::ResultExt, - header::time::timespec, + header::bits_time::timespec, platform::{ Pal, Sys, types::{c_char, c_int, time_t}, diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index d9c25b2443..c70eff7385 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -24,7 +24,7 @@ use core::{num::NonZeroU64, ptr}; // use header::sys_times::tms; use crate::{ error::{Errno, Result}, - header::{sys_utsname::utsname, time::timespec}, + header::{bits_time::timespec, sys_utsname::utsname}, }; mod epoll; diff --git a/src/platform/linux/signal.rs b/src/platform/linux/signal.rs index 71d78e5614..2034aac627 100644 --- a/src/platform/linux/signal.rs +++ b/src/platform/linux/signal.rs @@ -8,9 +8,9 @@ use super::{ use crate::{ error::{Errno, Result}, header::{ + bits_time::timespec, signal::{SA_RESTORER, SI_QUEUE, sigaction, siginfo_t, sigset_t, stack_t}, sys_time::itimerval, - time::timespec, }, }; diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs index 227c9b4d1e..0e3e806457 100644 --- a/src/platform/pal/mod.rs +++ b/src/platform/pal/mod.rs @@ -5,6 +5,7 @@ use crate::{ c_str::CStr, error::{Errno, Result}, header::{ + bits_time::timespec, signal::sigevent, sys_resource::{rlimit, rusage}, sys_select::timeval, @@ -12,7 +13,7 @@ use crate::{ sys_statvfs::statvfs, sys_time::timezone, sys_utsname::utsname, - time::{itimerspec, timespec}, + time::itimerspec, }, ld_so::tcb::OsSpecific, out::Out, diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs index 747e38acb1..52670daa6f 100644 --- a/src/platform/pal/signal.rs +++ b/src/platform/pal/signal.rs @@ -2,9 +2,9 @@ use super::super::{Pal, types::*}; use crate::{ error::{Errno, Result}, header::{ + bits_time::timespec, signal::{sigaction, siginfo_t, sigset_t, sigval, stack_t}, sys_time::itimerval, - time::timespec, }, }; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 1c901b11d4..c041d0a6fb 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -25,6 +25,7 @@ use crate::{ error::{Errno, Result}, fs::File, header::{ + bits_time::timespec, errno::{ EBADF, EBADFD, EBADR, EEXIST, EFAULT, EFBIG, EINTR, EINVAL, EIO, ENAMETOOLONG, ENOENT, ENOMEM, ENOSYS, EOPNOTSUPP, EPERM, ERANGE, @@ -43,7 +44,7 @@ use crate::{ sys_statvfs::statvfs, sys_time::timezone, sys_utsname::{UTSLENGTH, utsname}, - time::{TIMER_ABSTIME, itimerspec, timer_internal_t, timespec}, + time::{TIMER_ABSTIME, itimerspec, timer_internal_t}, unistd::{F_OK, R_OK, SEEK_CUR, SEEK_SET, W_OK, X_OK}, }, io::{self, BufReader, prelude::*}, diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index 2989c9da4f..239624ca9e 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -5,13 +5,13 @@ use super::{ use crate::{ error::{Errno, Result}, header::{ + bits_time::timespec, errno::{EINVAL, ENOSYS}, signal::{ SIG_BLOCK, SIG_DFL, SIG_IGN, SIG_SETMASK, SIG_UNBLOCK, SS_DISABLE, SS_ONSTACK, sigaction, siginfo_t, sigset_t, sigval, stack_t, ucontext_t, }, sys_time::{ITIMER_REAL, itimerval}, - time::timespec, }, }; use core::mem::offset_of; diff --git a/src/sync/cond.rs b/src/sync/cond.rs index 2ed1e7f795..827d9c93a2 100644 --- a/src/sync/cond.rs +++ b/src/sync/cond.rs @@ -3,9 +3,10 @@ use crate::{ error::Errno, header::{ + bits_time::timespec, errno::{EINVAL, ETIMEDOUT}, pthread::*, - time::{CLOCK_MONOTONIC, CLOCK_REALTIME, timespec, timespec_realtime_to_monotonic}, + time::{CLOCK_MONOTONIC, CLOCK_REALTIME, timespec_realtime_to_monotonic}, }, platform::types::clockid_t, }; diff --git a/src/sync/mod.rs b/src/sync/mod.rs index cd818df549..93bcab0ff3 100644 --- a/src/sync/mod.rs +++ b/src/sync/mod.rs @@ -20,8 +20,8 @@ pub use self::{ use crate::{ error::Errno, header::{ + bits_time::timespec, errno::{EAGAIN, EINTR, ETIMEDOUT}, - time::timespec, }, out::Out, platform::{Pal, Sys, types::c_int}, diff --git a/src/sync/pthread_mutex.rs b/src/sync/pthread_mutex.rs index dd6170d79f..f82294980b 100644 --- a/src/sync/pthread_mutex.rs +++ b/src/sync/pthread_mutex.rs @@ -5,7 +5,7 @@ use core::{ use crate::{ error::Errno, - header::{errno::*, pthread::*, time::timespec}, + header::{bits_time::timespec, errno::*, pthread::*}, }; use crate::platform::{Pal, Sys, types::c_int}; diff --git a/src/sync/rwlock.rs b/src/sync/rwlock.rs index 4f1c240610..d5ca2140a1 100644 --- a/src/sync/rwlock.rs +++ b/src/sync/rwlock.rs @@ -4,7 +4,7 @@ use core::{ sync::atomic::{AtomicU32, Ordering}, }; -use crate::{header::time::timespec, pthread::Pshared}; +use crate::{header::bits_time::timespec, pthread::Pshared}; pub struct InnerRwLock { state: AtomicU32, diff --git a/src/sync/semaphore.rs b/src/sync/semaphore.rs index 00908cc9b7..e4fa4568fc 100644 --- a/src/sync/semaphore.rs +++ b/src/sync/semaphore.rs @@ -2,7 +2,10 @@ //TODO: improve implementation use crate::{ - header::time::{CLOCK_MONOTONIC, CLOCK_REALTIME, timespec, timespec_realtime_to_monotonic}, + header::{ + bits_time::timespec, + time::{CLOCK_MONOTONIC, CLOCK_REALTIME, timespec_realtime_to_monotonic}, + }, platform::types::{c_uint, clockid_t}, }; From bb48f689684561bdfd7af05a900f6321aca42345 Mon Sep 17 00:00:00 2001 From: auronandace Date: Thu, 12 Feb 2026 13:16:23 +0000 Subject: [PATCH 2/5] redox import fixes for timespec --- src/platform/redox/event.rs | 2 +- src/platform/redox/libredox.rs | 2 +- src/platform/redox/timer.rs | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/platform/redox/event.rs b/src/platform/redox/event.rs index 900be2d352..cb46f27f83 100644 --- a/src/platform/redox/event.rs +++ b/src/platform/redox/event.rs @@ -1,9 +1,9 @@ use core::mem::size_of; use crate::header::{ + bits_time::timespec, fcntl::{O_CLOEXEC, O_CREAT, O_RDWR}, signal::sigset_t, - time::timespec, }; use super::libredox::RawResult; diff --git a/src/platform/redox/libredox.rs b/src/platform/redox/libredox.rs index 61edc5aa6a..50b91b4f29 100644 --- a/src/platform/redox/libredox.rs +++ b/src/platform/redox/libredox.rs @@ -10,7 +10,7 @@ use syscall::{EMFILE, Error, Result}; use crate::{ header::{ - errno::EINVAL, signal::sigaction, sys_stat::UTIME_NOW, sys_uio::iovec, time::timespec, + bits_time::timespec, errno::EINVAL, signal::sigaction, sys_stat::UTIME_NOW, sys_uio::iovec, }, out::Out, platform::{PalSignal, types::*}, diff --git a/src/platform/redox/timer.rs b/src/platform/redox/timer.rs index 76fa628ac8..b79a27dc02 100644 --- a/src/platform/redox/timer.rs +++ b/src/platform/redox/timer.rs @@ -3,9 +3,10 @@ use syscall::Error; use crate::{ error::{Errno, Result}, header::{ + bits_time::timespec, errno::EIO, signal::{SIGEV_SIGNAL, SIGEV_THREAD}, - time::{timer_internal_t, timespec}, + time::timer_internal_t, }, out::Out, platform::{Pal, Sys, sys::event, types::c_void}, From bc25b5a7edfaf94a996e812661f21d01541a7ec4 Mon Sep 17 00:00:00 2001 From: auronandace Date: Thu, 12 Feb 2026 13:33:54 +0000 Subject: [PATCH 3/5] add export renames to cbindgen files --- src/header/poll/cbindgen.toml | 3 +++ src/header/sched/cbindgen.toml | 3 +++ src/header/semaphore/cbindgen.toml | 3 +++ src/header/signal/cbindgen.toml | 1 + src/header/sys_stat/cbindgen.toml | 3 +++ src/header/sys_time/cbindgen.toml | 1 + src/header/time/cbindgen.toml | 1 + 7 files changed, 15 insertions(+) diff --git a/src/header/poll/cbindgen.toml b/src/header/poll/cbindgen.toml index d623b3a811..11047d5e92 100644 --- a/src/header/poll/cbindgen.toml +++ b/src/header/poll/cbindgen.toml @@ -10,3 +10,6 @@ cpp_compat = true [enum] prefix_with_name = true + +[export.rename] +"timespec" = "struct timespec" diff --git a/src/header/sched/cbindgen.toml b/src/header/sched/cbindgen.toml index 39dfb744db..1fadf677f2 100644 --- a/src/header/sched/cbindgen.toml +++ b/src/header/sched/cbindgen.toml @@ -10,3 +10,6 @@ cpp_compat = true [enum] prefix_with_name = true + +[export.rename] +"timespec" = "struct timespec" diff --git a/src/header/semaphore/cbindgen.toml b/src/header/semaphore/cbindgen.toml index 0bb0fb24ce..13bdf9cdc9 100644 --- a/src/header/semaphore/cbindgen.toml +++ b/src/header/semaphore/cbindgen.toml @@ -10,3 +10,6 @@ cpp_compat = true [enum] prefix_with_name = true + +[export.rename] +"timespec" = "struct timespec" diff --git a/src/header/signal/cbindgen.toml b/src/header/signal/cbindgen.toml index 8eb7d42591..fe4d3bf84a 100644 --- a/src/header/signal/cbindgen.toml +++ b/src/header/signal/cbindgen.toml @@ -14,3 +14,4 @@ prefix_with_name = true [export.rename] "sigaction" = "struct sigaction" +"timespec" = "struct timespec" diff --git a/src/header/sys_stat/cbindgen.toml b/src/header/sys_stat/cbindgen.toml index 7cd8feee2b..51cba69644 100644 --- a/src/header/sys_stat/cbindgen.toml +++ b/src/header/sys_stat/cbindgen.toml @@ -11,3 +11,6 @@ cpp_compat = true [enum] prefix_with_name = true + +[export.rename] +"timespec" = "struct timespec" diff --git a/src/header/sys_time/cbindgen.toml b/src/header/sys_time/cbindgen.toml index 1815e8c0a1..dea065fa69 100644 --- a/src/header/sys_time/cbindgen.toml +++ b/src/header/sys_time/cbindgen.toml @@ -13,4 +13,5 @@ cpp_compat = true prefix_with_name = true [export.rename] +"timespec" = "struct timespec" "timeval" = "struct timeval" diff --git a/src/header/time/cbindgen.toml b/src/header/time/cbindgen.toml index a09b92ed85..1f409617ca 100644 --- a/src/header/time/cbindgen.toml +++ b/src/header/time/cbindgen.toml @@ -13,4 +13,5 @@ struct sigevent; prefix_with_name = true [export.rename] +"timespec" = "struct timespec" "sigevent" = "struct sigevent" From 0e1af0503e62423a13a051041e47ee26aaaf0f1a Mon Sep 17 00:00:00 2001 From: auronandace Date: Thu, 12 Feb 2026 13:59:23 +0000 Subject: [PATCH 4/5] remove export rename from the bits cbindgen file --- src/header/bits_time/cbindgen.toml | 3 --- src/header/pthread/cbindgen.toml | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/header/bits_time/cbindgen.toml b/src/header/bits_time/cbindgen.toml index 2dbd877825..f38ff07f52 100644 --- a/src/header/bits_time/cbindgen.toml +++ b/src/header/bits_time/cbindgen.toml @@ -18,8 +18,5 @@ style = "Tag" no_includes = true cpp_compat = true -[export.rename] -"timespec" = "struct timespec" - [enum] prefix_with_name = true diff --git a/src/header/pthread/cbindgen.toml b/src/header/pthread/cbindgen.toml index 17d5b58674..04b8d7da80 100644 --- a/src/header/pthread/cbindgen.toml +++ b/src/header/pthread/cbindgen.toml @@ -6,6 +6,7 @@ no_includes = true cpp_compat = true [export.rename] +"timespec" = "struct timespec" "sched_param" = "struct sched_param" [enum] From f1ec5a485652c454cab4b550914017f143e708ca Mon Sep 17 00:00:00 2001 From: auronandace Date: Thu, 12 Feb 2026 14:28:47 +0000 Subject: [PATCH 5/5] add cbindgen struct to bits file --- src/header/bits_time/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/header/bits_time/mod.rs b/src/header/bits_time/mod.rs index c5f31b07f5..c564826efc 100644 --- a/src/header/bits_time/mod.rs +++ b/src/header/bits_time/mod.rs @@ -66,3 +66,6 @@ impl timespec { return self.tv_nsec == 0 && self.tv_sec == 0; } } + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn cbindgen_stupid_alias_timespec(_: timespec) {}