use crate::runtime::Locality;
use crate::sync_task_queue::SyncTaskList;
use crossbeam::utils::CachePadded;
use std::fmt::Debug;
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
#[derive(Default)]
pub enum Call {
#[default]
None,
PushCurrentTaskAtTheStartOfLIFOSharedQueue,
PushCurrentTaskTo(*const SyncTaskList),
PushCurrentTaskToAndRemoveItIfCounterIsZero(*const SyncTaskList, *const AtomicUsize, Ordering),
ReleaseAtomicBool(*const CachePadded<AtomicBool>),
PushFnToThreadPool(*mut dyn Fn()),
ChangeCurrentTaskLocality(Locality),
}
impl Call {
#[inline(always)]
pub fn is_none(&self) -> bool {
matches!(self, Self::None)
}
}
impl Eq for Call {}
impl PartialEq for Call {
fn eq(&self, other: &Self) -> bool {
std::mem::discriminant(self) == std::mem::discriminant(other)
}
}
impl Debug for Call {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::None => write!(f, "Call::None"),
Self::PushCurrentTaskAtTheStartOfLIFOSharedQueue => {
write!(f, "Call::YieldCurrentSharedTask")
}
Self::PushCurrentTaskTo(_) => write!(f, "Call::PushCurrentTaskTo"),
Self::PushCurrentTaskToAndRemoveItIfCounterIsZero(_, _, _) => {
write!(f, "Call::PushCurrentTaskToAndRemoveItIfCounterIsZero")
}
Self::ReleaseAtomicBool(_) => write!(f, "Call::ReleaseAtomicBool"),
Self::PushFnToThreadPool(_) => write!(f, "Call::PushFnToThreadPool"),
Self::ChangeCurrentTaskLocality(locality) => write!(
f,
"Call::ChangeCurrentTaskLocality with locality: {locality:?}"
),
}
}
}