wasmtime/profiling_agent/
vtune.rs1use crate::prelude::*;
16use crate::profiling_agent::ProfilingAgent;
17use ittapi::jit::MethodLoadBuilder;
18use std::sync::Mutex;
19
20struct VTuneAgent {
22 state: Mutex<State>,
25}
26
27#[derive(Default)]
29struct State {
30 vtune: ittapi::jit::Jit,
31}
32
33pub fn new() -> Result<Box<dyn ProfilingAgent>> {
35 Ok(Box::new(VTuneAgent {
36 state: Mutex::new(State {
37 vtune: Default::default(),
38 }),
39 }))
40}
41
42impl Drop for VTuneAgent {
43 fn drop(&mut self) {
44 self.state.lock().unwrap().event_shutdown();
45 }
46}
47
48impl State {
49 fn notify_code(&mut self, module_name: &str, method_name: &str, code: &[u8]) {
51 self.vtune
52 .load_method(
53 MethodLoadBuilder::new(method_name.to_owned(), code.as_ptr(), code.len())
54 .class_file_name(module_name.to_owned())
55 .source_file_name("<unknown wasm filename>".to_owned()),
56 )
57 .unwrap();
58 }
59
60 fn event_shutdown(&mut self) {
62 let _ = self.vtune.shutdown();
64 }
65}
66
67impl ProfilingAgent for VTuneAgent {
68 fn register_function(&self, name: &str, code: &[u8]) {
69 self.state.lock().unwrap().register_function(name, code);
70 }
71}
72
73impl State {
74 fn register_function(&mut self, name: &str, code: &[u8]) {
75 self.notify_code("wasmtime", name, code);
76 }
77}