1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
#![allow(non_upper_case_globals)] #![allow(non_camel_case_types)] #![allow(non_snake_case)] include!(concat!(env!("OUT_DIR"), "/bindings.rs")); #[macro_export] #[cfg(feature = "profiling_enabled")] macro_rules! scoped_tracepoint { ($name:ident) => { let tracepoint_name = concat!(stringify!($name), "\0"); ScopedTracepoint::start_trace(tracepoint_name.as_ptr() as _); let $name = ScopedTracepoint {}; }; } #[macro_export] #[cfg(not(feature = "profiling_enabled"))] macro_rules! scoped_tracepoint { ($name:ident) => { () }; } #[cfg(feature = "profiling_enabled")] pub struct ScopedTracepoint; #[cfg(feature = "profiling_enabled")] impl ScopedTracepoint { pub fn start_trace(name: *mut i8) { unsafe { ht_feature_callstack_start_string(ht_global_timeline_get(), name); } } } #[cfg(feature = "profiling_enabled")] pub struct HawktracerInstance { listener: *mut _HT_FileDumpListener, } #[cfg(feature = "profiling_enabled")] impl HawktracerInstance { pub fn new<S: Into<String>>(file_name: S, buffer_size: usize) -> HawktracerInstance { let file_name = std::ffi::CString::new(file_name.into()).unwrap(); use std::os::raw::c_char; let p: *mut *mut c_char = std::ptr::null_mut(); let listener = unsafe { ht_init(0, p); let listener = ht_file_dump_listener_create( file_name.as_ptr(), buffer_size, std::ptr::null_mut() as _, ); ht_timeline_register_listener( ht_global_timeline_get(), Some(ht_file_dump_listener_callback), listener as _, ); listener }; HawktracerInstance { listener: listener } } } #[cfg(feature = "profiling_enabled")] impl Drop for HawktracerInstance { fn drop(&mut self) { unsafe { ht_timeline_flush(ht_global_timeline_get()); ht_timeline_unregister_all_listeners(ht_global_timeline_get()); ht_file_dump_listener_destroy(self.listener); ht_deinit(); } } } #[cfg(feature = "profiling_enabled")] impl Drop for ScopedTracepoint { fn drop(&mut self) { unsafe { ht_feature_callstack_stop(ht_global_timeline_get()); } } } #[cfg(feature = "profiling_enabled")] pub fn create_hawktracer_instance<S: Into<String>>( file_name: S, buffer_size: usize, ) -> HawktracerInstance { let file_name = std::ffi::CString::new(file_name.into()).unwrap(); use std::os::raw::c_char; let p: *mut *mut c_char = std::ptr::null_mut(); let listener = unsafe { ht_init(0, p); let listener = ht_file_dump_listener_create( file_name.as_ptr(), buffer_size, std::ptr::null_mut() as _, ); ht_timeline_register_listener( ht_global_timeline_get(), Some(ht_file_dump_listener_callback), listener as _, ); listener }; HawktracerInstance { listener: listener } } #[cfg(not(feature = "profiling_enabled"))] pub fn create_hawktracer_instance<S: Into<String>>(_file_name: S, _buffer_size: usize) {}