• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::{backend, io};
2 
3 pub use backend::time::types::Timespec;
4 
5 #[cfg(not(any(
6     target_os = "dragonfly",
7     target_os = "emscripten",
8     target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11.
9     target_os = "ios",
10     target_os = "macos",
11     target_os = "openbsd",
12     target_os = "redox",
13     target_os = "wasi",
14 )))]
15 pub use backend::time::types::ClockId;
16 
17 /// `clock_nanosleep(id, 0, request, remain)`—Sleeps for a duration on a
18 /// given clock.
19 ///
20 /// This is `clock_nanosleep` specialized for the case of a relative sleep
21 /// interval. See [`clock_nanosleep_absolute`] for absolute intervals.
22 ///
23 /// # References
24 ///  - [POSIX]
25 ///  - [Linux]
26 ///
27 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html
28 /// [Linux]: https://man7.org/linux/man-pages/man2/clock_nanosleep.2.html
29 #[cfg(not(any(
30     target_os = "dragonfly",
31     target_os = "emscripten",
32     target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11.
33     target_os = "haiku",
34     target_os = "ios",
35     target_os = "macos",
36     target_os = "openbsd",
37     target_os = "redox",
38     target_os = "wasi",
39 )))]
40 #[inline]
clock_nanosleep_relative(id: ClockId, request: &Timespec) -> NanosleepRelativeResult41 pub fn clock_nanosleep_relative(id: ClockId, request: &Timespec) -> NanosleepRelativeResult {
42     backend::thread::syscalls::clock_nanosleep_relative(id, request)
43 }
44 
45 /// `clock_nanosleep(id, TIMER_ABSTIME, request, NULL)`—Sleeps until an
46 /// absolute time on a given clock.
47 ///
48 /// This is `clock_nanosleep` specialized for the case of an absolute sleep
49 /// interval. See [`clock_nanosleep_relative`] for relative intervals.
50 ///
51 /// # References
52 ///  - [POSIX]
53 ///  - [Linux]
54 ///
55 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html
56 /// [Linux]: https://man7.org/linux/man-pages/man2/clock_nanosleep.2.html
57 #[cfg(not(any(
58     target_os = "dragonfly",
59     target_os = "emscripten",
60     target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11.
61     target_os = "haiku",
62     target_os = "ios",
63     target_os = "macos",
64     target_os = "openbsd",
65     target_os = "redox",
66     target_os = "wasi",
67 )))]
68 #[inline]
clock_nanosleep_absolute(id: ClockId, request: &Timespec) -> io::Result<()>69 pub fn clock_nanosleep_absolute(id: ClockId, request: &Timespec) -> io::Result<()> {
70     backend::thread::syscalls::clock_nanosleep_absolute(id, request)
71 }
72 
73 /// `nanosleep(request, remain)`—Sleeps for a duration.
74 ///
75 /// This effectively uses the system monotonic clock.
76 ///
77 /// # References
78 ///  - [POSIX]
79 ///  - [Linux]
80 ///
81 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html
82 /// [Linux]: https://man7.org/linux/man-pages/man2/nanosleep.2.html
83 #[inline]
nanosleep(request: &Timespec) -> NanosleepRelativeResult84 pub fn nanosleep(request: &Timespec) -> NanosleepRelativeResult {
85     backend::thread::syscalls::nanosleep(request)
86 }
87 
88 /// A return type for `nanosleep` and `clock_nanosleep_relative`.
89 #[derive(Debug, Clone)]
90 #[must_use]
91 pub enum NanosleepRelativeResult {
92     /// The sleep completed normally.
93     Ok,
94     /// The sleep was interrupted, the remaining time is returned.
95     Interrupted(Timespec),
96     /// An invalid time value was provided.
97     Err(io::Errno),
98 }
99