#[derive(Debug, Clone)]
pub struct ExecutionRoutineGroup<S: SlaveLogicalCoreTask>
{
canContinue: CanContinue,
currentQueuePairCount: usize,
unnaturalDeaths: usize,
naturalDeaths: usize,
tasks: ArrayVec<[S; MaximumQueuePairs]>,
deaths: ArrayVec<[Option<Result<(), ()>>; MaximumQueuePairs]>,
}
impl<S: SlaveLogicalCoreTask> ExecutionRoutineGroup<S>
{
pub fn new(originalQueuePairCount: usize) -> Arc<Mutex<ExecutionRoutineGroup<S>>>
{
Arc::new
(
Mutex::new
(
ExecutionRoutineGroup
{
canContinue: CanContinue::newCanContinue(),
currentQueuePairCount: originalQueuePairCount,
unnaturalDeaths: 0,
naturalDeaths: 0,
tasks: ArrayVec::new(),
deaths: ArrayVec::new(),
}
)
)
}
#[inline(always)]
pub fn makeStop(&mut self)
{
self.canContinue.makeStop()
}
pub fn canContinueClone(&self) -> CanContinue
{
self.canContinue.clone()
}
pub fn pushAndRunOnSlave(&mut self, task: S)
{
self.tasks.push(task);
self.deaths.push(None);
self.tasks.last_mut().unwrap().runOnSlave().expect("Could not start to run on slave");
}
pub fn notifyOfDeath(&mut self, queuePairIdentifier: QueueIdentifier, causeOfDeath: Result<(), ()>)
{
if let Some(index) = self.deaths.get_mut(queuePairIdentifier as usize)
{
self.currentQueuePairCount -= 1;
if causeOfDeath.is_ok()
{
self.naturalDeaths += 1;
}
else
{
self.unnaturalDeaths += 1;
}
*index = Some(causeOfDeath);
}
else
{
panic!("No queue pair '{}'", queuePairIdentifier);
}
}
pub fn hasUnnaturalDeaths(&mut self) -> bool
{
self.unnaturalDeaths != 0
}
}