| use crate::{backend, io}; | |
| pub use crate::timespec::Timespec; | |
| #[cfg(not(any( | |
| apple, | |
| target_os = "dragonfly", | |
| target_os = "espidf", | |
| target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11. | |
| target_os = "openbsd", | |
| target_os = "redox", | |
| target_os = "vita", | |
| target_os = "wasi", | |
| )))] | |
| pub use crate::clockid::ClockId; | |
| /// `clock_nanosleep(id, 0, request, remain)`—Sleeps for a duration on a | |
| /// given clock. | |
| /// | |
| /// This is `clock_nanosleep` specialized for the case of a relative sleep | |
| /// interval. See [`clock_nanosleep_absolute`] for absolute intervals. | |
| /// | |
| /// # References | |
| /// - [POSIX] | |
| /// - [Linux] | |
| /// | |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html | |
| /// [Linux]: https://man7.org/linux/man-pages/man2/clock_nanosleep.2.html | |
| #[cfg(not(any( | |
| apple, | |
| target_os = "dragonfly", | |
| target_os = "emscripten", | |
| target_os = "espidf", | |
| target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11. | |
| target_os = "haiku", | |
| target_os = "openbsd", | |
| target_os = "redox", | |
| target_os = "vita", | |
| target_os = "wasi", | |
| )))] | |
| #[inline] | |
| pub fn clock_nanosleep_relative(id: ClockId, request: &Timespec) -> NanosleepRelativeResult { | |
| backend::thread::syscalls::clock_nanosleep_relative(id, request) | |
| } | |
| /// `clock_nanosleep(id, TIMER_ABSTIME, request, NULL)`—Sleeps until an | |
| /// absolute time on a given clock. | |
| /// | |
| /// This is `clock_nanosleep` specialized for the case of an absolute sleep | |
| /// interval. See [`clock_nanosleep_relative`] for relative intervals. | |
| /// | |
| /// # References | |
| /// - [POSIX] | |
| /// - [Linux] | |
| /// | |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html | |
| /// [Linux]: https://man7.org/linux/man-pages/man2/clock_nanosleep.2.html | |
| #[cfg(not(any( | |
| apple, | |
| target_os = "dragonfly", | |
| target_os = "emscripten", | |
| target_os = "espidf", | |
| target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11. | |
| target_os = "haiku", | |
| target_os = "openbsd", | |
| target_os = "redox", | |
| target_os = "vita", | |
| target_os = "wasi", | |
| )))] | |
| #[inline] | |
| pub fn clock_nanosleep_absolute(id: ClockId, request: &Timespec) -> io::Result<()> { | |
| backend::thread::syscalls::clock_nanosleep_absolute(id, request) | |
| } | |
| /// `nanosleep(request, remain)`—Sleeps for a duration. | |
| /// | |
| /// This effectively uses the system monotonic clock. | |
| /// | |
| /// # References | |
| /// - [POSIX] | |
| /// - [Linux] | |
| /// | |
| /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html | |
| /// [Linux]: https://man7.org/linux/man-pages/man2/nanosleep.2.html | |
| #[inline] | |
| pub fn nanosleep(request: &Timespec) -> NanosleepRelativeResult { | |
| backend::thread::syscalls::nanosleep(request) | |
| } | |
| /// A return type for `nanosleep` and `clock_nanosleep_relative`. | |
| #[derive(Debug, Clone)] | |
| #[must_use] | |
| pub enum NanosleepRelativeResult { | |
| /// The sleep completed normally. | |
| Ok, | |
| /// The sleep was interrupted, the remaining time is returned. | |
| Interrupted(Timespec), | |
| /// An invalid time value was provided. | |
| Err(io::Errno), | |
| } |