Skip to main content

cbtop/bricks/generators/
memory.rs

1//! Memory bandwidth stress generator
2
3use crate::brick::{Brick, BrickAssertion, BrickBudget, BrickVerification};
4use std::any::Any;
5
6pub struct MemBandwidthBrick {
7    is_running: bool,
8    intensity: f64,
9    buffer_size: usize,
10    buffer: Vec<u8>,
11}
12
13impl MemBandwidthBrick {
14    pub fn new(buffer_size: usize) -> Self {
15        Self {
16            is_running: false,
17            intensity: 0.0,
18            buffer_size,
19            buffer: vec![0u8; buffer_size],
20        }
21    }
22
23    pub fn start(&mut self) {
24        self.is_running = true;
25    }
26
27    pub fn stop(&mut self) {
28        self.is_running = false;
29    }
30
31    pub fn is_running(&self) -> bool {
32        self.is_running
33    }
34
35    pub fn set_intensity(&mut self, intensity: f64) {
36        self.intensity = intensity.clamp(0.0, 1.0);
37    }
38}
39
40impl Default for MemBandwidthBrick {
41    fn default() -> Self {
42        Self::new(64 * 1024 * 1024) // 64 MB
43    }
44}
45
46impl Brick for MemBandwidthBrick {
47    fn brick_name(&self) -> &'static str {
48        "mem_bandwidth"
49    }
50
51    fn assertions(&self) -> Vec<BrickAssertion> {
52        vec![
53            BrickAssertion::custom("buffer_allocated", |_| true),
54            BrickAssertion::max_latency_ms(100),
55        ]
56    }
57
58    fn budget(&self) -> BrickBudget {
59        BrickBudget {
60            collect_ms: 16,
61            layout_ms: 0,
62            render_ms: 0,
63        }
64    }
65
66    fn verify(&self) -> BrickVerification {
67        let mut v = BrickVerification::new();
68        for assertion in self.assertions() {
69            v.check(&assertion);
70        }
71        v
72    }
73
74    fn as_any(&self) -> &dyn Any {
75        self
76    }
77}