use std::env;
use std::num::ParseIntError;
use backtrace::resolve;
use thiserror::Error;
pub(super) const CALLIPER_RUN_ID: &str = "CALLIPER_RUN_ID";
#[derive(Clone, Debug, Error, PartialEq)]
pub enum RunIdError {
#[error("Run ID is not an integer")]
NotAnInteger(#[from] ParseIntError),
#[error("Environment variable is not present or it is not a valid UTF-8")]
EnvironmentVariableError(#[from] env::VarError),
}
pub(crate) fn get_run_id() -> Result<usize, RunIdError> {
env::var(CALLIPER_RUN_ID)
.map_err(|e| e.into())
.and_then(|v| v.parse().map_err(|e: ParseIntError| e.into()))
}
pub fn is_setup_run() -> bool {
get_run_id().is_err()
}
#[rustversion::before(1.66)]
pub fn black_box<T>(dummy: T) -> T {
unsafe {
let ret = std::ptr::read_volatile(&dummy);
std::mem::forget(dummy);
ret
}
}
#[rustversion::since(1.66)]
pub use std::hint::black_box;
pub(crate) fn get_raw_function_name(f: fn()) -> String {
let addr = f as usize + 1;
let mut fn_name = None;
resolve(addr as _, |symbol| {
fn_name = Some(symbol.name().unwrap().as_str().unwrap().to_string());
});
fn_name.unwrap()
}
#[cfg(test)]
mod tests {
mod get_raw_function_name {
use crate::utils::get_raw_function_name;
#[test]
fn is_correctly_detected_for_no_mangle_function() {
#[no_mangle]
fn foo() {}
assert_eq!(get_raw_function_name(foo), "foo");
}
}
}