use crate::align::{AlignedBuf, DEFAULT_ALIGNMENT};
use crate::error::Result;
use super::layout::{DWB_CAPACITY, DWB_SLOT_STRIDE};
pub(super) struct StagedRing {
images: Vec<AlignedBuf>,
staged: u32,
}
impl StagedRing {
pub(super) fn new() -> Result<Self> {
let mut images = Vec::with_capacity(DWB_CAPACITY);
for _ in 0..DWB_CAPACITY {
images.push(AlignedBuf::new(DWB_SLOT_STRIDE, DEFAULT_ALIGNMENT)?);
}
Ok(Self { images, staged: 0 })
}
pub(super) fn cleared_image(&mut self, idx: u32) -> &mut AlignedBuf {
let image = self.image_mut(idx);
image.clear();
image
}
pub(super) fn image_mut(&mut self, idx: u32) -> &mut AlignedBuf {
&mut self.images[ring_index(idx)]
}
pub(super) fn mark_staged(&mut self) {
self.staged = self.staged.saturating_add(1);
}
pub(super) fn surviving(&self) -> u32 {
self.staged.min(DWB_CAPACITY as u32)
}
pub(super) fn clear(&mut self) {
self.staged = 0;
}
}
fn ring_index(idx: u32) -> usize {
idx as usize % DWB_CAPACITY
}