Skip to main content

Instant

Struct Instant 

Source
pub struct Instant { /* private fields */ }
Available on crate feature full only.
Expand description

A measurement of the current system time. Opaque and useful only with [Duration].

Instants are opaque types that should usually only be compared to one another. [get()] can be used to get the internal value, but no guarantees are made about the meaning of the value. The meaning of the result of get() varies by system and may even change at runtime during a single boot. A best-attempt value of the time since system boot can be retrieved with [nanos_since_boot()].

The size of an Instant struct may vary depending on the target platform.

Example:

ⓘ
use core::time::Duration;
use kernel_api::time::Instant;
use kernel_api::threading::sleep;
use kernel_api::executor::block_on;

fn main() {
   let now = Instant::now();

   // we sleep for 2 seconds
   block_on(sleep(Duration::new(2, 0)));
   // it prints '2'
   sprintln!("{}", now.elapsed().as_secs());
}

§Underlying system

The following mechanisms are currently being used by now() to find out the current time:

PlatformMechanism
x86_64rdtsc instruction
These mechanisms might change over time.

Note: mathematical operations like add() may panic if the underlying structure cannot represent the new point in time.

Implementations§

Source§

impl Instant

Source

pub fn now() -> Self

The current system time.

§Examples
use kernel_api::time::Instant;

let now = Instant::now();
Source

pub fn duration_since(&self, earlier: Self) -> Duration

Returns the amount of time elapsed from another instant to this one.

§Panics

This method may panic if self is earlier than earlier.

§Examples
ⓘ
use core::time::Duration;
use kernel_api::time::Instant;
use kernel_api::threading::sleep;
use kernel_api::executor::block_on;

let now = Instant::now();
block_on(sleep(Duration::new(1, 0)));
let new_now = Instant::now();
sprintln!("{:?}", new_now.duration_since(now));
Source

pub fn checked_duration_since(&self, earlier: Self) -> Option<Duration>

Returns the amount of time elapsed from another instant to this one, or None if that instant is later than this one.

§Examples
ⓘ
use core::time::Duration;
use kernel_api::time::Instant;
use kernel_api::threading::sleep;
use kernel_api::executor::block_on;

let now = Instant::now();
block_on(sleep(Duration::new(1, 0)));
let new_now = Instant::now();
sprintln!("{:?}", new_now.checked_duration_since(now));
sprintln!("{:?}", now.checked_duration_since(new_now)); // None
Source

pub fn saturating_duration_since(&self, earlier: Self) -> Duration

Returns the amount of time elapsed from another instant to this one, or zero duration if that instant is later than this one.

§Examples
ⓘ
use core::time::Duration;
use kernel_api::time::Instant;
use kernel_api::threading::sleep;
use kernel_api::executor::block_on;

let now = Instant::now();
block_on(sleep(Duration::new(1, 0)));
let new_now = Instant::now();
sprintln!("{:?}", new_now.saturating_duration_since(now));
sprintln!("{:?}", now.saturating_duration_since(new_now)); // 0ns
Source

pub fn elapsed(&self) -> Duration

Returns the amount of time elapsed since this instant.

§Panics

This method may panic if the current time is earlier than self.

§Examples
ⓘ
use core::time::Duration;
use kernel_api::time::Instant;
use kernel_api::threading::sleep;
use kernel_api::executor::block_on;

let instant = Instant::now();
let three_secs = Duration::from_secs(3);
block_on(sleep(three_secs));
assert!(instant.elapsed() >= three_secs);
Source

pub fn checked_add(&self, duration: Duration) -> Option<Self>

Returns Some(t) where t is the time self + duration if t can be represented as Instant (which means it’s inside the bounds of the underlying data structure), None otherwise.

Source

pub fn checked_sub(&self, duration: Duration) -> Option<Self>

Returns Some(t) where t is the time self - duration if t can be represented as Instant (which means it’s inside the bounds of the underlying data structure), None otherwise.

Source

pub fn nanos_since_boot(&self) -> u128

The number of nanoseconds since the system booted.

No guarantees are provided on time before overflow.

Source

pub const fn get(&self) -> u128

Returns the opaque numeric value of the instant.

The meaning of the returned value is architecture dependant, see the struct level documentation for more information.

Trait Implementations§

Source§

impl Add<Duration> for Instant

Source§

fn add(self, rhs: Duration) -> Self::Output

§Panics

This function may panic if the resulting point in time cannot be represented by the underlying data structure. See Instant::checked_add for a version without panic.

Source§

type Output = Instant

The resulting type after applying the + operator.
Source§

impl AddAssign<Duration> for Instant

Source§

fn add_assign(&mut self, rhs: Duration)

Performs the += operation. Read more
Source§

impl Clone for Instant

Source§

fn clone(&self) -> Instant

Returns a duplicate of the value. Read more
1.0.0 (const: unstable)§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Instant

Source§

impl Debug for Instant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Instant

Source§

impl Hash for Instant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given [Hasher]. Read more
1.3.0§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given [Hasher]. Read more
Source§

impl Ord for Instant

Source§

fn cmp(&self, other: &Instant) -> Ordering

This method returns an [Ordering] between self and other. Read more
1.21.0 (const: unstable)§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable)§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable)§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
§

fn clamp_to<R>(self, range: R) -> Self
where Self: Sized, R: ClampBounds<Self>,

🔬This is a nightly-only experimental API. (clamp_to)
Restrict a value to a certain range. Read more
Source§

impl PartialEq for Instant

Source§

fn eq(&self, other: &Instant) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable)§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl PartialOrd for Instant

Source§

fn partial_cmp(&self, other: &Instant) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable)§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable)§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable)§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable)§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for Instant

Source§

impl Sub for Instant

Source§

type Output = Duration

The resulting type after applying the - operator.
Source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
Source§

impl Sub<Duration> for Instant

Source§

fn sub(self, rhs: Duration) -> Self::Output

§Panics

This function may panic if the resulting point in time cannot be represented by the underlying data structure. See Instant::checked_sub for a version without panic.

Source§

type Output = Instant

The resulting type after applying the - operator.
Source§

impl SubAssign<Duration> for Instant

Source§

fn sub_assign(&mut self, rhs: Duration)

Performs the -= operation. Read more

Auto Trait Implementations§

§

impl Freeze for Instant

§

impl RefUnwindSafe for Instant

§

impl Send for Instant

§

impl Sync for Instant

§

impl Unpin for Instant

§

impl UnsafeUnpin for Instant

§

impl UnwindSafe for Instant

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = !

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.