1 use crate::{
2 wasm_byte_vec_t, wasm_engine_t, wasm_name_t, wasmtime_error_t, wasmtime_module_t,
3 wasmtime_store_t,
4 };
5 use std::slice;
6 use std::str::from_utf8;
7 use std::time::Duration;
8 use wasmtime::GuestProfiler;
9
10 pub struct wasmtime_guestprofiler_t {
11 guest_profiler: GuestProfiler,
12 }
13
14 wasmtime_c_api_macros::declare_own!(wasmtime_guestprofiler_t);
15
16 #[repr(C)]
17 pub struct wasmtime_guestprofiler_modules_t<'a> {
18 name: &'a wasm_name_t,
19 module: &'a wasmtime_module_t,
20 }
21
22 #[unsafe(no_mangle)]
wasmtime_guestprofiler_new( engine: &wasm_engine_t, module_name: &wasm_name_t, interval_nanos: u64, modules: *const wasmtime_guestprofiler_modules_t, modules_len: usize, ) -> Box<wasmtime_guestprofiler_t>23 pub unsafe extern "C" fn wasmtime_guestprofiler_new(
24 engine: &wasm_engine_t,
25 module_name: &wasm_name_t,
26 interval_nanos: u64,
27 modules: *const wasmtime_guestprofiler_modules_t,
28 modules_len: usize,
29 ) -> Box<wasmtime_guestprofiler_t> {
30 let module_name = from_utf8(&module_name.as_slice()).expect("not valid utf-8");
31 let list = slice::from_raw_parts(modules, modules_len)
32 .iter()
33 .map(|entry| {
34 (
35 from_utf8(entry.name.as_slice())
36 .expect("not valid utf-8")
37 .to_owned(),
38 entry.module.module.clone(),
39 )
40 })
41 .collect::<Vec<_>>();
42 Box::new(wasmtime_guestprofiler_t {
43 guest_profiler: GuestProfiler::new(
44 &engine.engine,
45 module_name,
46 Duration::from_nanos(interval_nanos),
47 list,
48 )
49 .unwrap(),
50 })
51 }
52
53 #[unsafe(no_mangle)]
wasmtime_guestprofiler_sample( guestprofiler: &mut wasmtime_guestprofiler_t, store: &wasmtime_store_t, delta_nanos: u64, )54 pub extern "C" fn wasmtime_guestprofiler_sample(
55 guestprofiler: &mut wasmtime_guestprofiler_t,
56 store: &wasmtime_store_t,
57 delta_nanos: u64,
58 ) {
59 guestprofiler
60 .guest_profiler
61 .sample(&store.store, Duration::from_nanos(delta_nanos));
62 }
63
64 #[unsafe(no_mangle)]
wasmtime_guestprofiler_finish( guestprofiler: Box<wasmtime_guestprofiler_t>, out: &mut wasm_byte_vec_t, ) -> Option<Box<wasmtime_error_t>>65 pub extern "C" fn wasmtime_guestprofiler_finish(
66 guestprofiler: Box<wasmtime_guestprofiler_t>,
67 out: &mut wasm_byte_vec_t,
68 ) -> Option<Box<wasmtime_error_t>> {
69 let mut buf = vec![];
70 match guestprofiler.guest_profiler.finish(&mut buf) {
71 Ok(()) => {
72 out.set_buffer(buf);
73 None
74 }
75 Err(e) => Some(Box::new(e.into())),
76 }
77 }
78