sel4_shared_ring_buffer_bookkeeping/
slot_count_tracker.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7pub 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}