use std::collections::VecDeque;
use crate::payload::RtPayload;
use crate::task::TaskId;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ChanId(pub u64);
pub(crate) struct Chan {
pub capacity: Option<usize>,
pub queue: VecDeque<RtPayload>,
pub blocked_senders: VecDeque<(TaskId, RtPayload)>,
pub blocked_receivers: VecDeque<TaskId>,
pub closed: bool,
}
impl Chan {
pub(crate) fn new(capacity: Option<usize>) -> Self {
Chan {
capacity,
queue: VecDeque::new(),
blocked_senders: VecDeque::new(),
blocked_receivers: VecDeque::new(),
closed: false,
}
}
pub(crate) fn has_room(&self) -> bool {
match self.capacity {
None => true,
Some(cap) => self.queue.len() < cap,
}
}
pub(crate) fn can_recv(&self) -> bool {
!self.queue.is_empty() || !self.blocked_senders.is_empty() || self.closed
}
}