mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
rust: time: Introduce Delta type
Introduce a type representing a span of time. Define our own type because `core::time::Duration` is large and could panic during creation. time::Ktime could be also used for time duration but timestamp and timedelta are different so better to use a new type. i64 is used instead of u64 to represent a span of time; some C drivers uses negative Deltas and i64 is more compatible with Ktime using i64 too (e.g., ktime_[us|ms]_delta() APIs return i64 so we create Delta object without type conversion. i64 is used instead of bindings::ktime_t because when the ktime_t type is used as timestamp, it represents values from 0 to KTIME_MAX, which is different from Delta. as_millis() method isn't used in this patchset. It's planned to be used in Binder driver. Reviewed-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Gary Guo <gary@garyguo.net> Reviewed-by: Fiona Behrens <me@kloenk.dev> Tested-by: Daniel Almeida <daniel.almeida@collabora.com> Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> Link: https://lore.kernel.org/r/20250423192857.199712-4-fujita.tomonori@gmail.com Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
This commit is contained in:
parent
3caad57d29
commit
fae0cdc123
|
|
@ -10,9 +10,15 @@
|
|||
|
||||
pub mod hrtimer;
|
||||
|
||||
/// The number of nanoseconds per microsecond.
|
||||
pub const NSEC_PER_USEC: i64 = bindings::NSEC_PER_USEC as i64;
|
||||
|
||||
/// The number of nanoseconds per millisecond.
|
||||
pub const NSEC_PER_MSEC: i64 = bindings::NSEC_PER_MSEC as i64;
|
||||
|
||||
/// The number of nanoseconds per second.
|
||||
pub const NSEC_PER_SEC: i64 = bindings::NSEC_PER_SEC as i64;
|
||||
|
||||
/// The time unit of Linux kernel. One jiffy equals (1/HZ) second.
|
||||
pub type Jiffies = crate::ffi::c_ulong;
|
||||
|
||||
|
|
@ -149,3 +155,85 @@ fn into_c(self) -> bindings::clockid_t {
|
|||
self as bindings::clockid_t
|
||||
}
|
||||
}
|
||||
|
||||
/// A span of time.
|
||||
///
|
||||
/// This struct represents a span of time, with its value stored as nanoseconds.
|
||||
/// The value can represent any valid i64 value, including negative, zero, and
|
||||
/// positive numbers.
|
||||
#[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Debug)]
|
||||
pub struct Delta {
|
||||
nanos: i64,
|
||||
}
|
||||
|
||||
impl Delta {
|
||||
/// A span of time equal to zero.
|
||||
pub const ZERO: Self = Self { nanos: 0 };
|
||||
|
||||
/// Create a new [`Delta`] from a number of microseconds.
|
||||
///
|
||||
/// The `micros` can range from -9_223_372_036_854_775 to 9_223_372_036_854_775.
|
||||
/// If `micros` is outside this range, `i64::MIN` is used for negative values,
|
||||
/// and `i64::MAX` is used for positive values due to saturation.
|
||||
#[inline]
|
||||
pub const fn from_micros(micros: i64) -> Self {
|
||||
Self {
|
||||
nanos: micros.saturating_mul(NSEC_PER_USEC),
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new [`Delta`] from a number of milliseconds.
|
||||
///
|
||||
/// The `millis` can range from -9_223_372_036_854 to 9_223_372_036_854.
|
||||
/// If `millis` is outside this range, `i64::MIN` is used for negative values,
|
||||
/// and `i64::MAX` is used for positive values due to saturation.
|
||||
#[inline]
|
||||
pub const fn from_millis(millis: i64) -> Self {
|
||||
Self {
|
||||
nanos: millis.saturating_mul(NSEC_PER_MSEC),
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new [`Delta`] from a number of seconds.
|
||||
///
|
||||
/// The `secs` can range from -9_223_372_036 to 9_223_372_036.
|
||||
/// If `secs` is outside this range, `i64::MIN` is used for negative values,
|
||||
/// and `i64::MAX` is used for positive values due to saturation.
|
||||
#[inline]
|
||||
pub const fn from_secs(secs: i64) -> Self {
|
||||
Self {
|
||||
nanos: secs.saturating_mul(NSEC_PER_SEC),
|
||||
}
|
||||
}
|
||||
|
||||
/// Return `true` if the [`Delta`] spans no time.
|
||||
#[inline]
|
||||
pub fn is_zero(self) -> bool {
|
||||
self.as_nanos() == 0
|
||||
}
|
||||
|
||||
/// Return `true` if the [`Delta`] spans a negative amount of time.
|
||||
#[inline]
|
||||
pub fn is_negative(self) -> bool {
|
||||
self.as_nanos() < 0
|
||||
}
|
||||
|
||||
/// Return the number of nanoseconds in the [`Delta`].
|
||||
#[inline]
|
||||
pub const fn as_nanos(self) -> i64 {
|
||||
self.nanos
|
||||
}
|
||||
|
||||
/// Return the smallest number of microseconds greater than or equal
|
||||
/// to the value in the [`Delta`].
|
||||
#[inline]
|
||||
pub const fn as_micros_ceil(self) -> i64 {
|
||||
self.as_nanos().saturating_add(NSEC_PER_USEC - 1) / NSEC_PER_USEC
|
||||
}
|
||||
|
||||
/// Return the number of milliseconds in the [`Delta`].
|
||||
#[inline]
|
||||
pub const fn as_millis(self) -> i64 {
|
||||
self.as_nanos() / NSEC_PER_MSEC
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user