use crate::ibverbs::completion_queue::{CompletionQueue, PollSlot};
use crate::ibverbs::error::IbvResult;
use crate::ibverbs::work::WorkCompletion;
use intmap::IntMap;
#[derive(Debug)]
pub struct CachedCompletionQueue {
cq: CompletionQueue,
cache: IntMap<u64, WorkCompletion>,
poll_buf: Vec<PollSlot>,
}
impl CachedCompletionQueue {
pub(super) fn wrap_cq(cq: CompletionQueue) -> Self {
let poll_buf_length = cq.min_capacity() as usize;
Self {
cq,
cache: IntMap::new(),
poll_buf: vec![PollSlot::default(); poll_buf_length],
}
}
pub fn update(&mut self) -> IbvResult<usize> {
let polled_wcs = self.cq.poll(self.poll_buf.as_mut_slice())?;
let polled_num = polled_wcs.len();
for wc in polled_wcs {
self.cache.insert(wc.wr_id(), wc);
}
Ok(polled_num)
}
pub fn consume(&mut self, wr_id: u64) -> Option<WorkCompletion> {
self.cache.remove(wr_id)
}
}