sel4_shared_ring_buffer_bookkeeping/
slot_count_tracker.rs
1pub struct SlotCountTracker {
8 stored_num_free: usize,
9}
10
11impl SlotCountTracker {
12 pub fn new(initial_num_free: usize) -> Self {
13 Self {
14 stored_num_free: initial_num_free,
15 }
16 }
17
18 pub fn report_occupied(&mut self, count: usize) -> Result<(), SlotCountTrackerError> {
19 if count > self.stored_num_free {
20 return Err(SlotCountTrackerError::ReportOccupiedCountGreaterThanStoredNumFree);
21 }
22 self.stored_num_free -= count;
23 Ok(())
24 }
25
26 pub fn redeem_newly_free(
27 &mut self,
28 current_num_free: usize,
29 ) -> Result<usize, SlotCountTrackerError> {
30 if current_num_free < self.stored_num_free {
31 return Err(SlotCountTrackerError::CurrentNumFreeLessThanStoredNumFree);
32 }
33 let newly_free = current_num_free - self.stored_num_free;
34 self.stored_num_free = current_num_free;
35 Ok(newly_free)
36 }
37}
38
39#[derive(Debug)]
40pub enum SlotCountTrackerError {
41 CurrentNumFreeLessThanStoredNumFree,
42 ReportOccupiedCountGreaterThanStoredNumFree,
43}