use super::*;
impl<T, X> IoRing<T, X> {
pub fn with_inventory(
submission_queue_size: u32,
completion_queue_size: u32,
) -> io::Result<Self> {
let caps = capabilities()?;
let version = RingVersion::HIGHEST_KNOWN.min(caps.max_version);
Self::with_version_and_inventory(version, submission_queue_size, completion_queue_size)
}
pub(crate) fn stow(&mut self, id: OperationId, entry: Entry<T, X>) {
debug_assert_eq!(
id.ring_id(),
self.accounting.ring_id(),
"an identity minted by another ring must never reach this inventory"
);
self.inventory.insert(id.user_data(), entry);
}
pub(crate) fn reclaim(&mut self, user_data: usize) -> Option<Entry<T, X>> {
self.inventory.remove(&user_data)
}
pub fn try_pop(&mut self) -> io::Result<Option<HeldCompletion<T, X>>> {
let Some(completion) = self.pop_raw()? else {
return Ok(None);
};
let held = self
.reclaim(completion.user_data())
.map(|entry| (entry.payload, entry.extra));
Ok(Some((completion, held)))
}
#[must_use]
pub fn held(&self) -> usize {
self.inventory.len()
}
}