wasmer_wasix/syscalls/unix/
mod.rs

1use std::mem;
2
3use libc::{
4    CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_REALTIME, CLOCK_THREAD_CPUTIME_ID,
5    clock_getres, clock_gettime, timespec,
6};
7use wasmer::WasmRef;
8use wasmer_wasix_types::wasi::{Errno, Snapshot0Clockid, Timestamp};
9
10use crate::syscalls::types::*;
11
12pub fn platform_clock_res_get(
13    clock_id: Snapshot0Clockid,
14    resolution: WasmRef<Timestamp>,
15) -> Result<i64, Errno> {
16    let unix_clock_id = match clock_id {
17        Snapshot0Clockid::Monotonic => CLOCK_MONOTONIC,
18        Snapshot0Clockid::ProcessCputimeId => CLOCK_PROCESS_CPUTIME_ID,
19        Snapshot0Clockid::Realtime => CLOCK_REALTIME,
20        Snapshot0Clockid::ThreadCputimeId => CLOCK_THREAD_CPUTIME_ID,
21        _ => return Err(Errno::Inval),
22    };
23
24    let (output, timespec_out) = unsafe {
25        let mut timespec_out: timespec = timespec {
26            tv_sec: 0,
27            tv_nsec: 0,
28        };
29        (clock_getres(unix_clock_id, &mut timespec_out), timespec_out)
30    };
31
32    let t_out = (timespec_out.tv_sec * 1_000_000_000).wrapping_add(timespec_out.tv_nsec);
33    Ok(t_out)
34}
35
36pub fn platform_clock_time_get(
37    clock_id: Snapshot0Clockid,
38    precision: Timestamp,
39) -> Result<i64, Errno> {
40    let unix_clock_id = match clock_id {
41        Snapshot0Clockid::Monotonic => CLOCK_MONOTONIC,
42        Snapshot0Clockid::ProcessCputimeId => CLOCK_PROCESS_CPUTIME_ID,
43        Snapshot0Clockid::Realtime => CLOCK_REALTIME,
44        Snapshot0Clockid::ThreadCputimeId => CLOCK_THREAD_CPUTIME_ID,
45        _ => return Err(Errno::Inval),
46    };
47
48    let (output, timespec_out) = unsafe {
49        let mut timespec_out: timespec = timespec {
50            tv_sec: 0,
51            tv_nsec: 0,
52        };
53        (
54            clock_gettime(unix_clock_id, &mut timespec_out),
55            timespec_out,
56        )
57    };
58
59    let t_out = (timespec_out.tv_sec * 1_000_000_000).wrapping_add(timespec_out.tv_nsec);
60    Ok(t_out)
61}