Sha256: 3d6f01b3129bd4cb60eca5f17137e589365092a03f1bbec812c655d6c023476e

Contents?: true

Size: 1.75 KB

Versions: 33

Compression:

Stored size: 1.75 KB

Contents

use crate::{Error, ErrorExt};
use cap_std::time::{Duration, Instant, SystemTime};

pub enum SystemTimeSpec {
    SymbolicNow,
    Absolute(SystemTime),
}

pub trait WasiSystemClock: Send + Sync {
    fn resolution(&self) -> Duration;
    fn now(&self, precision: Duration) -> SystemTime;
}

pub trait WasiMonotonicClock: Send + Sync {
    fn resolution(&self) -> Duration;
    fn now(&self, precision: Duration) -> Instant;
}

pub struct WasiMonotonicOffsetClock {
    pub creation_time: cap_std::time::Instant,
    pub abs_clock: Box<dyn WasiMonotonicClock>,
}

impl WasiMonotonicOffsetClock {
    pub fn new(clock: impl 'static + WasiMonotonicClock) -> Self {
        Self {
            creation_time: clock.now(clock.resolution()),
            abs_clock: Box::new(clock),
        }
    }
}

pub struct WasiClocks {
    pub system: Option<Box<dyn WasiSystemClock>>,
    pub monotonic: Option<WasiMonotonicOffsetClock>,
}

impl WasiClocks {
    pub fn new() -> Self {
        Self {
            system: None,
            monotonic: None,
        }
    }

    pub fn with_system(mut self, clock: impl 'static + WasiSystemClock) -> Self {
        self.system = Some(Box::new(clock));
        self
    }

    pub fn with_monotonic(mut self, clock: impl 'static + WasiMonotonicClock) -> Self {
        self.monotonic = Some(WasiMonotonicOffsetClock::new(clock));
        self
    }

    pub fn system(&self) -> Result<&dyn WasiSystemClock, Error> {
        self.system
            .as_deref()
            .ok_or_else(|| Error::badf().context("system clock is not supported"))
    }

    pub fn monotonic(&self) -> Result<&WasiMonotonicOffsetClock, Error> {
        self.monotonic
            .as_ref()
            .ok_or_else(|| Error::badf().context("monotonic clock is not supported"))
    }
}

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
wasmtime-30.0.2 ./ext/cargo-vendor/wasi-common-30.0.2/src/clocks.rs
wasmtime-29.0.0 ./ext/cargo-vendor/wasi-common-29.0.0/src/clocks.rs
wasmtime-28.0.0 ./ext/cargo-vendor/wasi-common-28.0.0/src/clocks.rs
wasmtime-27.0.0 ./ext/cargo-vendor/wasi-common-27.0.0/src/clocks.rs
wasmtime-26.0.0 ./ext/cargo-vendor/wasi-common-26.0.0/src/clocks.rs
wasmtime-25.0.2 ./ext/cargo-vendor/wasi-common-25.0.2/src/clocks.rs
wasmtime-25.0.1 ./ext/cargo-vendor/wasi-common-25.0.1/src/clocks.rs
wasmtime-25.0.0 ./ext/cargo-vendor/wasi-common-25.0.0/src/clocks.rs
wasmtime-24.0.0 ./ext/cargo-vendor/wasi-common-24.0.0/src/clocks.rs
wasmtime-23.0.2 ./ext/cargo-vendor/wasi-common-23.0.2/src/clocks.rs
wasmtime-22.0.0 ./ext/cargo-vendor/wasi-common-22.0.0/src/clocks.rs
wasmtime-21.0.1 ./ext/cargo-vendor/wasi-common-21.0.1/src/clocks.rs
wasmtime-20.0.2 ./ext/cargo-vendor/wasi-common-20.0.2/src/clocks.rs
wasmtime-20.0.0 ./ext/cargo-vendor/wasi-common-20.0.0/src/clocks.rs
wasmtime-18.0.3 ./ext/cargo-vendor/wasi-common-18.0.3/src/clocks.rs
wasmtime-17.0.1 ./ext/cargo-vendor/wasi-common-17.0.1/src/clocks.rs
wasmtime-17.0.0 ./ext/cargo-vendor/wasi-common-17.0.0/src/clocks.rs
wasmtime-16.0.0 ./ext/cargo-vendor/wasi-common-16.0.0/src/clocks.rs
wasmtime-15.0.1 ./ext/cargo-vendor/wasi-common-15.0.1/src/clocks.rs
wasmtime-15.0.0 ./ext/cargo-vendor/wasi-common-15.0.0/src/clocks.rs