use std::cell::RefCell;
use std::sync::atomic::{AtomicUsize, Ordering};
type Num = i64;
#[derive(Default, Debug, Clone, Copy)]
pub struct AllocStats {
pub slag_alloc: Num,
pub cache_alloc: Num,
pub local_free: Num,
pub remote_free: Num,
pub bulk_remote_free: Num,
pub transition_available: Num,
pub transition_full: Num,
pub grabbed_available: Num,
pub grabbed_dirty: Num,
pub grabbed_clean: Num,
}
lazy_static! {
pub static ref THREAD_CTR: AtomicUsize = AtomicUsize::new(0);
}
#[allow(dead_code)]
pub struct StatsHandle {
pub stats: RefCell<AllocStats>,
pub thread_num: usize,
}
thread_local! {
pub static LOCAL_STATS: StatsHandle = StatsHandle {
stats: RefCell::new(AllocStats::default()),
thread_num: THREAD_CTR.fetch_add(1, Ordering::Relaxed),
};
}
macro_rules! trace_event {
($fld:tt) => {
#[cfg(feature = "print_stats")]
{
let _ = super::stats::LOCAL_STATS.try_with(|sh| {
if let Ok(mut _f_ref) = sh.stats.try_borrow_mut() {
_f_ref.$fld += 1;
let allocs = _f_ref.slag_alloc + _f_ref.cache_alloc;
if (allocs % (1 << 22)) == 0 {
trace!("thread {:2?} - {:?}", sh.thread_num, *_f_ref);
}
}
});
}
};
}