use std::sync::atomic::Ordering;
use super::TRACKER;
pub fn should_sample(rate: f64) -> bool {
use std::sync::atomic::AtomicU64;
static SEED: AtomicU64 = AtomicU64::new(0x853c49e6748fea9b);
let mut x = SEED.load(Ordering::Relaxed);
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
SEED.store(x, Ordering::Relaxed);
(x as f64 / u64::MAX as f64) < rate
}
#[inline(always)]
pub fn track_new_sampled<T>(
#[cfg_attr(not(feature = "track"), allow(unused_variables))] name: &str,
value: T,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] sample_rate: f64,
) -> T {
#[cfg(feature = "track")]
{
if should_sample(sample_rate) {
let type_name = std::any::type_name::<T>();
let mut tracker = TRACKER.lock();
tracker.record_new(name, type_name);
}
}
value
}
#[inline(always)]
pub fn track_new_with_id_sampled<T>(
#[cfg_attr(not(feature = "track"), allow(unused_variables))] id: usize,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] name: &str,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
value: T,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] sample_rate: f64,
) -> T {
#[cfg(feature = "track")]
{
if should_sample(sample_rate) {
let type_name = std::any::type_name::<T>();
let mut tracker = TRACKER.lock();
tracker.record_new_with_id(id, name, type_name, location);
}
}
value
}
#[inline(always)]
pub fn track_borrow_sampled<'a, T: ?Sized>(
#[cfg_attr(not(feature = "track"), allow(unused_variables))] name: &str,
value: &'a T,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] sample_rate: f64,
) -> &'a T {
#[cfg(feature = "track")]
{
if should_sample(sample_rate) {
let mut tracker = TRACKER.lock();
tracker.record_borrow(name, "unknown", false);
}
}
value
}
#[inline(always)]
pub fn track_borrow_mut_sampled<'a, T: ?Sized>(
#[cfg_attr(not(feature = "track"), allow(unused_variables))] name: &str,
value: &'a mut T,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] sample_rate: f64,
) -> &'a mut T {
#[cfg(feature = "track")]
{
if should_sample(sample_rate) {
let mut tracker = TRACKER.lock();
tracker.record_borrow(name, "unknown", true);
}
}
value
}
#[inline(always)]
pub fn track_drop_sampled(
#[cfg_attr(not(feature = "track"), allow(unused_variables))] name: &str,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] sample_rate: f64,
) {
#[cfg(feature = "track")]
{
if should_sample(sample_rate) {
let mut tracker = TRACKER.lock();
tracker.record_drop(name);
}
}
}
#[inline(always)]
pub fn track_move_sampled<T>(
#[cfg_attr(not(feature = "track"), allow(unused_variables))] from: &str,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] to: &str,
value: T,
#[cfg_attr(not(feature = "track"), allow(unused_variables))] sample_rate: f64,
) -> T {
#[cfg(feature = "track")]
{
if should_sample(sample_rate) {
let mut tracker = TRACKER.lock();
tracker.record_move(from, to);
}
}
value
}