use self::tls_executor::*;
use super::*;
use std::sync::atomic::{AtomicBool, Ordering};
#[doc(hidden)]
#[derive(Debug)]
pub struct MachineAdapter {
id: Uuid,
once: AtomicBool,
pub key: usize,
pub state: MachineState,
normalized_adapter: Box<dyn MachineDependentAdapter>,
}
impl MachineAdapter {
#[inline]
pub fn new(adapter: Box<dyn MachineDependentAdapter>) -> Self {
Self {
id: uuid::Uuid::new_v4(),
once: AtomicBool::new(true),
key: 0,
state: MachineState::default(),
normalized_adapter: adapter,
}
}
#[inline]
pub const fn get_id(&self) -> Uuid { self.id }
#[inline]
pub fn get_and_clear_once(&self) -> bool { self.once.swap(false, Ordering::SeqCst) }
#[inline]
pub const fn get_key(&self) -> usize { self.key }
#[inline]
pub fn get_state(&self) -> CollectiveState { self.state.get() }
#[inline]
pub fn set_state(&self, new: CollectiveState) { self.state.set(new); }
#[inline]
pub fn clone_state(&self) -> MachineState { self.state.clone() }
#[inline]
pub fn sel_recv<'a>(&'a self, sel: &mut crossbeam::channel::Select<'a>) -> usize {
self.normalized_adapter.sel_recv(sel)
}
#[inline]
pub fn receive_cmd(&self, time_slice: Duration, stats: &mut ExecutorStats) {
self.normalized_adapter
.receive_cmd(&self.state, self.get_and_clear_once(), self.id, time_slice, stats)
}
#[inline]
pub fn try_recv_task(&self, machine: &ShareableMachine) -> Option<Task> {
self.normalized_adapter.try_recv_task(machine)
}
}
#[doc(hidden)]
pub type ShareableMachine = Arc<MachineAdapter>;
#[doc(hidden)]
#[derive(Copy, Clone, Debug, Eq, PartialEq, SmartDefault)]
#[allow(dead_code)]
pub enum CollectiveState {
#[default]
New,
Waiting,
Ready,
Running,
SendBlock,
RecvBlock,
Disconnected,
Dead,
}
#[doc(hidden)]
pub type MachineState = SharedProtectedObject<CollectiveState>;
#[doc(hidden)]
pub trait MachineDependentAdapter: Send + Sync + fmt::Debug {
fn sel_recv<'a>(&'a self, sel: &mut crossbeam::channel::Select<'a>) -> usize;
fn try_recv_task(&self, machine: &ShareableMachine) -> Option<Task>;
fn receive_cmd(
&self,
state: &MachineState,
once: bool,
uuid: Uuid,
time_slice: Duration,
stats: &mut ExecutorStats,
);
}