#![allow(unused)]
use cadence::prelude::*;
use cadence::StatsdClient;
use std::alloc::{GlobalAlloc, Layout, System};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread;
use std::time::Duration;
pub fn run_arc_threaded_test(client: StatsdClient, num_threads: u64, iterations: u64) {
let shared_client = Arc::new(client);
let threads: Vec<_> = (0..num_threads)
.map(|_| {
let local_client = shared_client.clone();
thread::spawn(move || {
for i in 0..iterations {
local_client.count("some.counter", i as i64).unwrap();
local_client.time("some.timer", i).unwrap();
local_client.time("some.timer", Duration::from_millis(i)).unwrap();
local_client.gauge("some.gauge", i).unwrap();
local_client.gauge("some.gauge", i as f64).unwrap();
local_client.meter("some.meter", i).unwrap();
local_client.histogram("some.histogram", i).unwrap();
local_client
.histogram("some.histogram", Duration::from_nanos(i))
.unwrap();
local_client.histogram("some.histogram", i as f64).unwrap();
local_client.distribution("some.distribution", i).unwrap();
local_client.distribution("some.distribution", i as f64).unwrap();
local_client.set("some.set", i as i64).unwrap();
thread::sleep(Duration::from_millis(1));
}
})
})
.collect();
for t in threads {
t.join().unwrap();
}
}
#[derive(Debug, Default)]
pub struct InstrumentedAllocator {
num_allocs: AtomicUsize,
num_bytes: AtomicUsize,
enabled: AtomicBool,
}
impl InstrumentedAllocator {
pub const fn new() -> Self {
InstrumentedAllocator {
num_allocs: AtomicUsize::new(0),
num_bytes: AtomicUsize::new(0),
enabled: AtomicBool::new(false),
}
}
pub fn enable(&self) {
self.enabled.store(true, Ordering::Release);
}
pub fn is_enabled(&self) -> bool {
self.enabled.load(Ordering::Acquire)
}
pub fn disable(&self) {
self.enabled.store(false, Ordering::Release);
}
pub fn num_allocs(&self) -> usize {
self.num_allocs.load(Ordering::Acquire)
}
pub fn num_bytes(&self) -> usize {
self.num_bytes.load(Ordering::Acquire)
}
}
unsafe impl GlobalAlloc for InstrumentedAllocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let res = System.alloc(layout);
if !res.is_null() && self.is_enabled() {
self.num_bytes.fetch_add(layout.size(), Ordering::Release);
self.num_allocs.fetch_add(1, Ordering::Release);
}
res
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
System.dealloc(ptr, layout)
}
}