1 use crate::backend::c;
2 use crate::fd::BorrowedFd;
3 
4 /// `CLOCK_*` constants for use with [`clock_gettime`].
5 ///
6 /// These constants are always supported at runtime, so `clock_gettime` never
7 /// has to fail with `INVAL` due to an unsupported clock. See
8 /// [`DynamicClockId`] for a greater set of clocks, with the caveat that not
9 /// all of them are always supported.
10 ///
11 /// [`clock_gettime`]: crate::time::clock_gettime
12 #[cfg(not(any(apple, target_os = "wasi")))]
13 #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
14 #[cfg_attr(not(any(target_os = "aix", target_os = "dragonfly")), repr(i32))]
15 #[cfg_attr(target_os = "dragonfly", repr(u64))]
16 #[cfg_attr(target_os = "aix", repr(i64))]
17 #[non_exhaustive]
18 pub enum ClockId {
19     /// `CLOCK_REALTIME`
20     #[doc(alias = "CLOCK_REALTIME")]
21     Realtime = bitcast!(c::CLOCK_REALTIME),
22 
23     /// `CLOCK_MONOTONIC`
24     #[doc(alias = "CLOCK_MONOTONIC")]
25     Monotonic = bitcast!(c::CLOCK_MONOTONIC),
26 
27     /// `CLOCK_UPTIME`
28     #[cfg(any(freebsdlike, target_os = "openbsd"))]
29     #[doc(alias = "CLOCK_UPTIME")]
30     Uptime = c::CLOCK_UPTIME,
31 
32     /// `CLOCK_PROCESS_CPUTIME_ID`
33     #[cfg(not(any(
34         solarish,
35         target_os = "netbsd",
36         target_os = "redox",
37         target_os = "vita"
38     )))]
39     #[doc(alias = "CLOCK_PROCESS_CPUTIME_ID")]
40     ProcessCPUTime = c::CLOCK_PROCESS_CPUTIME_ID,
41 
42     /// `CLOCK_THREAD_CPUTIME_ID`
43     #[cfg(not(any(
44         solarish,
45         target_os = "netbsd",
46         target_os = "redox",
47         target_os = "vita"
48     )))]
49     #[doc(alias = "CLOCK_THREAD_CPUTIME_ID")]
50     ThreadCPUTime = c::CLOCK_THREAD_CPUTIME_ID,
51 
52     /// `CLOCK_REALTIME_COARSE`
53     #[cfg(any(linux_kernel, target_os = "freebsd"))]
54     #[doc(alias = "CLOCK_REALTIME_COARSE")]
55     RealtimeCoarse = c::CLOCK_REALTIME_COARSE,
56 
57     /// `CLOCK_MONOTONIC_COARSE`
58     #[cfg(any(linux_kernel, target_os = "freebsd"))]
59     #[doc(alias = "CLOCK_MONOTONIC_COARSE")]
60     MonotonicCoarse = c::CLOCK_MONOTONIC_COARSE,
61 
62     /// `CLOCK_MONOTONIC_RAW`
63     #[cfg(linux_kernel)]
64     #[doc(alias = "CLOCK_MONOTONIC_RAW")]
65     MonotonicRaw = c::CLOCK_MONOTONIC_RAW,
66 
67     /// `CLOCK_REALTIME_ALARM`
68     #[cfg(linux_kernel)]
69     #[doc(alias = "CLOCK_REALTIME_ALARM")]
70     RealtimeAlarm = bitcast!(c::CLOCK_REALTIME_ALARM),
71 
72     /// `CLOCK_TAI`, available on Linux >= 3.10
73     #[cfg(all(linux_kernel, feature = "linux_4_11"))]
74     #[doc(alias = "CLOCK_TAI")]
75     Tai = bitcast!(c::CLOCK_TAI),
76 
77     /// `CLOCK_BOOTTIME`
78     ///
79     /// On FreeBSD, use [`Self::Uptime`], as `CLOCK_BOOTTIME` is an alias for
80     /// `CLOCK_UPTIME`.
81     ///
82     /// [`Self::Uptime`]: https://docs.rs/rustix/*/x86_64-unknown-freebsd/rustix/time/enum.ClockId.html#variant.Uptime
83     #[cfg(any(linux_kernel, target_os = "fuchsia", target_os = "openbsd"))]
84     #[doc(alias = "CLOCK_BOOTTIME")]
85     Boottime = bitcast!(c::CLOCK_BOOTTIME),
86 
87     /// `CLOCK_BOOTTIME_ALARM`
88     #[cfg(any(linux_kernel, target_os = "fuchsia"))]
89     #[doc(alias = "CLOCK_BOOTTIME_ALARM")]
90     BoottimeAlarm = bitcast!(c::CLOCK_BOOTTIME_ALARM),
91 }
92 
93 /// `CLOCK_*` constants for use with [`clock_gettime`].
94 ///
95 /// These constants are always supported at runtime, so `clock_gettime` never
96 /// has to fail with `INVAL` due to an unsupported clock. See
97 /// [`DynamicClockId`] for a greater set of clocks, with the caveat that not
98 /// all of them are always supported.
99 ///
100 /// [`clock_gettime`]: crate::time::clock_gettime
101 #[cfg(apple)]
102 #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
103 #[repr(u32)]
104 #[non_exhaustive]
105 pub enum ClockId {
106     /// `CLOCK_REALTIME`
107     #[doc(alias = "CLOCK_REALTIME")]
108     Realtime = c::CLOCK_REALTIME,
109 
110     /// `CLOCK_MONOTONIC`
111     #[doc(alias = "CLOCK_MONOTONIC")]
112     Monotonic = c::CLOCK_MONOTONIC,
113 
114     /// `CLOCK_PROCESS_CPUTIME_ID`
115     #[doc(alias = "CLOCK_PROCESS_CPUTIME_ID")]
116     ProcessCPUTime = c::CLOCK_PROCESS_CPUTIME_ID,
117 
118     /// `CLOCK_THREAD_CPUTIME_ID`
119     #[doc(alias = "CLOCK_THREAD_CPUTIME_ID")]
120     ThreadCPUTime = c::CLOCK_THREAD_CPUTIME_ID,
121 }
122 
123 /// `CLOCK_*` constants for use with [`clock_gettime_dynamic`].
124 ///
125 /// These constants may be unsupported at runtime, depending on the OS version,
126 /// and `clock_gettime_dynamic` may fail with `INVAL`. See [`ClockId`] for
127 /// clocks which are always supported at runtime.
128 ///
129 /// [`clock_gettime_dynamic`]: crate::time::clock_gettime_dynamic
130 #[cfg(not(target_os = "wasi"))]
131 #[derive(Debug, Copy, Clone)]
132 #[non_exhaustive]
133 pub enum DynamicClockId<'a> {
134     /// `ClockId` values that are always supported at runtime.
135     Known(ClockId),
136 
137     /// Linux dynamic clocks.
138     Dynamic(BorrowedFd<'a>),
139 
140     /// `CLOCK_REALTIME_ALARM`
141     #[cfg(linux_kernel)]
142     #[doc(alias = "CLOCK_REALTIME_ALARM")]
143     RealtimeAlarm,
144 
145     /// `CLOCK_TAI`, available on Linux >= 3.10
146     #[cfg(linux_kernel)]
147     #[doc(alias = "CLOCK_TAI")]
148     Tai,
149 
150     /// `CLOCK_BOOTTIME`
151     #[cfg(any(
152         linux_kernel,
153         target_os = "freebsd",
154         target_os = "fuchsia",
155         target_os = "openbsd"
156     ))]
157     #[doc(alias = "CLOCK_BOOTTIME")]
158     Boottime,
159 
160     /// `CLOCK_BOOTTIME_ALARM`
161     #[cfg(any(linux_kernel, target_os = "fuchsia"))]
162     #[doc(alias = "CLOCK_BOOTTIME_ALARM")]
163     BoottimeAlarm,
164 }
165