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