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}