nio_metrics/
lib.rs

1use std::{
2    any::Any,
3    fmt::Debug,
4    sync::atomic::{AtomicUsize, Ordering::Relaxed},
5};
6
7pub trait Measurement: Debug + Send + Sync + Any {
8    fn init(&mut self, _worker_threads: usize) {}
9    fn queue_drained(&self, _worker_id: usize) {}
10    fn queue_notified(&self, _worker_id: usize) {}
11}
12
13#[derive(Debug, Default)]
14struct TaskQueue {
15    drained: AtomicUsize,
16    notified: AtomicUsize,
17}
18
19#[derive(Debug, Default)]
20pub struct SimpleMeasurement {
21    workers: Vec<TaskQueue>,
22}
23
24impl Measurement for SimpleMeasurement {
25    fn init(&mut self, worker_threads: usize) {
26        self.workers = (0..worker_threads).map(|_| TaskQueue::default()).collect();
27    }
28
29    fn queue_drained(&self, worker_id: usize) {
30        self.workers[worker_id].drained.fetch_add(1, Relaxed);
31    }
32
33    fn queue_notified(&self, worker_id: usize) {
34        self.workers[worker_id].notified.fetch_add(1, Relaxed);
35    }
36}
37
38impl SimpleMeasurement {
39    pub fn new() -> SimpleMeasurement {
40        SimpleMeasurement { workers: vec![] }
41    }
42}