cbtop/bricks/generators/
memory.rs1use 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) }
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}