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