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