Allow selecting a clock source for timers by passing a `ClockId` variant to `HrTimer::new`.
Unified · Split
| @@ -83,3 +83,69 @@ impl core::ops::Sub for Ktime { · 82 unmodified lines | |||
| 83 | } | 83 | } |
| 84 | } | 84 | } |
| 85 | } | 85 | } |
| 86 | |||
| 87 | /// An identifier for a clock. Used when specifying clock sources. | ||
| 88 | /// | ||
| 89 | /// | ||
| 90 | /// Selection of the clock depends on the use case. In some cases the usage of a | ||
| 91 | /// particular clock is mandatory, e.g. in network protocols, filesystems.In other | ||
| 92 | /// cases the user of the clock has to decide which clock is best suited for the | ||
| 93 | /// purpose. In most scenarios clock [`ClockId::Monotonic`] is the best choice as it | ||
| 94 | /// provides a accurate monotonic notion of time (leap second smearing ignored). | ||
| 95 | #[derive(Clone, Copy, PartialEq, Eq, Debug)] | ||
| 96 | #[repr(u32)] | ||
| 97 | pub enum ClockId { | ||
| 98 | /// A settable system-wide clock that measures real (i.e., wall-clock) time. | ||
| 99 | /// | ||
| 100 | /// Setting this clock requires appropriate privileges. This clock is | ||
| 101 | /// affected by discontinuous jumps in the system time (e.g., if the system | ||
| 102 | /// administrator manually changes the clock), and by frequency adjustments | ||
| 103 | /// performed by NTP and similar applications via adjtime(3), adjtimex(2), | ||
| 104 | /// clock_adjtime(2), and ntp_adjtime(3). This clock normally counts the | ||
| 105 | /// number of seconds since 1970-01-01 00:00:00 Coordinated Universal Time | ||
| 106 | /// (UTC) except that it ignores leap seconds; near a leap second it may be | ||
| 107 | /// adjusted by leap second smearing to stay roughly in sync with UTC. Leap | ||
| 108 | /// second smearing applies frequency adjustments to the clock to speed up | ||
| 109 | /// or slow down the clock to account for the leap second without | ||
| 110 | /// discontinuities in the clock. If leap second smearing is not applied, | ||
| 111 | /// the clock will experience discontinuity around leap second adjustment. | ||
| 112 | RealTime = bindings::CLOCK_REALTIME, | ||
| 113 | /// A monotonically increasing clock. | ||
| 114 | /// | ||
| 115 | /// A nonsettable system-wide clock that represents monotonic time since—as | ||
| 116 | /// described by POSIX—"some unspecified point in the past". On Linux, that | ||
| 117 | /// point corresponds to the number of seconds that the system has been | ||
| 118 | /// running since it was booted. | ||
| 119 | /// | ||
| 120 | /// The CLOCK_MONOTONIC clock is not affected by discontinuous jumps in the | ||
| 121 | /// CLOCK_REAL (e.g., if the system administrator manually changes the | ||
| 122 | /// clock), but is affected by frequency adjustments. This clock does not | ||
| 123 | /// count time that the system is suspended. | ||
| 124 | Monotonic = bindings::CLOCK_MONOTONIC, | ||
| 125 | /// A monotonic that ticks while system is suspended. | ||
| 126 | /// | ||
| 127 | /// A nonsettable system-wide clock that is identical to CLOCK_MONOTONIC, | ||
| 128 | /// except that it also includes any time that the system is suspended. This | ||
| 129 | /// allows applications to get a suspend-aware monotonic clock without | ||
| 130 | /// having to deal with the complications of CLOCK_REALTIME, which may have | ||
| 131 | /// discontinuities if the time is changed using settimeofday(2) or similar. | ||
| 132 | BootTime = bindings::CLOCK_BOOTTIME, | ||
| 133 | /// International Atomic Time. | ||
| 134 | /// | ||
| 135 | /// A system-wide clock derived from wall-clock time but counting leap seconds. | ||
| 136 | /// | ||
| 137 | /// This clock is coupled to CLOCK_REALTIME and will be set when CLOCK_REALTIME is | ||
| 138 | /// set, or when the offset to CLOCK_REALTIME is changed via adjtimex(2). This | ||
| 139 | /// usually happens during boot and **should** not happen during normal operations. | ||
| 140 | /// However, if NTP or another application adjusts CLOCK_REALTIME by leap second | ||
| 141 | /// smearing, this clock will not be precise during leap second smearing. | ||
| 142 | /// | ||
| 143 | /// The acronym TAI refers to International Atomic Time. | ||
| 144 | TAI = bindings::CLOCK_TAI, | ||
| 145 | } | ||
| 146 | |||
| 147 | impl ClockId { | ||
| 148 | fn into_c(self) -> bindings::clockid_t { | ||
| 149 | self as bindings::clockid_t | ||
| 150 | } | ||
| 151 | } | ||
| @@ -67,6 +67,7 @@ · 66 unmodified lines | |||
| 67 | //! A `restart` operation on a timer in the **stopped** state is equivalent to a | 67 | //! A `restart` operation on a timer in the **stopped** state is equivalent to a |
| 68 | //! `start` operation. | 68 | //! `start` operation. |
| 69 | 69 | ||
| 70 | use super::ClockId; | ||
| 70 | use crate::{init::PinInit, prelude::*, time::Ktime, types::Opaque}; | 71 | use crate::{init::PinInit, prelude::*, time::Ktime, types::Opaque}; |
| 71 | use core::marker::PhantomData; | 72 | use core::marker::PhantomData; |
| 72 | 73 | ||
| @@ -94,7 +95,7 @@ unsafe impl<T> Sync for HrTimer<T> {} · 21 unmodified lines | |||
| 94 | 95 | ||
| 95 | impl<T> HrTimer<T> { | 96 | impl<T> HrTimer<T> { |
| 96 | /// Return an initializer for a new timer instance. | 97 | /// Return an initializer for a new timer instance. |
| 97 | pub fn new(mode: HrTimerMode) -> impl PinInit<Self> | 98 | pub fn new(mode: HrTimerMode, clock: ClockId) -> impl PinInit<Self> |
| 98 | where | 99 | where |
| 99 | T: HrTimerCallback, | 100 | T: HrTimerCallback, |
| 100 | { | 101 | { |
| @@ -108,7 +109,7 @@ impl<T> HrTimer<T> { · 7 unmodified lines | |||
| 108 | bindings::hrtimer_setup( | 109 | bindings::hrtimer_setup( |
| 109 | place, | 110 | place, |
| 110 | Some(T::Pointer::run), | 111 | Some(T::Pointer::run), |
| 111 | bindings::CLOCK_MONOTONIC as i32, | 112 | clock.into_c(), |
| 112 | mode.into_c(), | 113 | mode.into_c(), |
| 113 | ); | 114 | ); |
| 114 | } | 115 | } |