wasmer_wasix/syscalls/unix/
mod.rs1use 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}