use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
static ENABLED: AtomicBool = AtomicBool::new(false);
static INIT: std::sync::Once = std::sync::Once::new();
#[inline]
fn enabled() -> bool {
INIT.call_once(|| {
if std::env::var_os("RUSTZMQ2_WAKE_COUNT").is_some() {
ENABLED.store(true, Ordering::Relaxed);
}
});
ENABLED.load(Ordering::Relaxed)
}
macro_rules! counter {
($name:ident) => {
pub(crate) static $name: AtomicU64 = AtomicU64::new(0);
};
}
counter!(PEER_LOOP_ITERS);
counter!(PEER_LOOP_READ_WAKES);
counter!(PEER_LOOP_OUTBOUND_WAKES);
counter!(PEER_LOOP_WRITABLE_WAKES);
counter!(RECV_NEXT_WAKES);
counter!(INLINE_WRITES);
#[inline]
pub(crate) fn bump(c: &AtomicU64) {
if enabled() {
c.fetch_add(1, Ordering::Relaxed);
}
}
pub fn dump_and_reset(label: &str) {
if !enabled() {
return;
}
let pl = PEER_LOOP_ITERS.swap(0, Ordering::Relaxed);
let rd = PEER_LOOP_READ_WAKES.swap(0, Ordering::Relaxed);
let ob = PEER_LOOP_OUTBOUND_WAKES.swap(0, Ordering::Relaxed);
let wr = PEER_LOOP_WRITABLE_WAKES.swap(0, Ordering::Relaxed);
let rn = RECV_NEXT_WAKES.swap(0, Ordering::Relaxed);
let il = INLINE_WRITES.swap(0, Ordering::Relaxed);
eprintln!(
"[wake-count {label}] peer_loop_iters={pl} read={rd} outbound={ob} writable={wr} recv_next={rn} inline_writes={il}",
);
if rn > 0 {
eprintln!(
"[wake-count {label}] per recv_next: peer_loop_iters={:.2} read={:.2} outbound={:.2} writable={:.2} inline={:.2}",
pl as f64 / rn as f64,
rd as f64 / rn as f64,
ob as f64 / rn as f64,
wr as f64 / rn as f64,
il as f64 / rn as f64,
);
}
}