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