use std::ffi::CString;
pub struct Region(ittapi_sys::__itt_pt_region);
impl Region {
#[must_use]
pub fn new(name: &str) -> Self {
let c_string =
CString::new(name).expect("unable to create a CString; does it contain a 0 byte?");
#[cfg(unix)]
let create_fn = unsafe { ittapi_sys::__itt_pt_region_create_ptr__3_0 };
#[cfg(windows)]
let create_fn = unsafe { ittapi_sys::__itt_pt_region_createA_ptr__3_0 };
let region = if let Some(create_fn) = create_fn {
unsafe { create_fn(c_string.as_ptr()) }
} else {
u8::MAX
};
Self(region)
}
#[inline]
#[must_use]
pub fn mark(&self) -> MarkedRegion<'_> {
unsafe { ittapi_sys::__itt_mark_pt_region_begin(self.0) };
MarkedRegion(self)
}
}
pub struct MarkedRegion<'a>(&'a Region);
impl MarkedRegion<'_> {
#[inline]
pub fn end(self) {
}
}
impl Drop for MarkedRegion<'_> {
#[inline]
fn drop(&mut self) {
unsafe { ittapi_sys::__itt_mark_pt_region_end(self.0 .0) };
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[should_panic(expected = "unable to create a CString; does it contain a 0 byte?")]
fn zero_byte() {
let _region = Region::new("zero\0byte\0name");
}
#[test]
fn sanity() {
let region = Region::new("region");
for _ in 0..10 {
let _marked_region = region.mark();
_marked_region.end();
}
}
}