use crate::wait_queue::WaitQueue;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum Opcode {
Exclusive,
Shared,
Semaphore(u8),
Wait,
}
impl Opcode {
#[inline]
pub(crate) const fn can_release(self, state: usize) -> bool {
match self {
Opcode::Exclusive => {
let data = state & WaitQueue::DATA_MASK;
data == WaitQueue::DATA_MASK
}
Opcode::Shared => {
let data = state & WaitQueue::DATA_MASK;
data >= 1 && data != WaitQueue::DATA_MASK
}
Opcode::Semaphore(count) => {
let data = state & WaitQueue::DATA_MASK;
let count = count as usize;
data >= count
}
Opcode::Wait => true,
}
}
#[inline]
pub(crate) const fn release_count(self) -> usize {
match self {
Opcode::Exclusive => WaitQueue::DATA_MASK,
Opcode::Shared => 1,
Opcode::Semaphore(count) => {
let count = count as usize;
debug_assert!(count <= WaitQueue::LOCKED_FLAG);
count
}
Opcode::Wait => 0,
}
}
}