use super::*;
#[derive(Debug)]
pub struct DeadRanks {
flags: Vec<AtomicBool>,
}
impl DeadRanks {
pub fn new(world_size: usize) -> Arc<Self> {
Arc::new(Self {
flags: (0..world_size).map(|_| AtomicBool::new(false)).collect(),
})
}
pub fn declare_dead(&self, rank: usize) {
if let Some(flag) = self.flags.get(rank) {
flag.store(true, Ordering::SeqCst);
}
}
pub fn is_dead(&self, rank: usize) -> bool {
self.flags
.get(rank)
.map(|f| f.load(Ordering::SeqCst))
.unwrap_or(false)
}
pub fn dead_count(&self) -> usize {
self.flags
.iter()
.filter(|f| f.load(Ordering::SeqCst))
.count()
}
pub fn world_size(&self) -> usize {
self.flags.len()
}
}