use std::sync::atomic::{AtomicBool, Ordering};
#[derive(Debug)]
pub(crate) struct StreamState {
read_open: AtomicBool,
write_open: AtomicBool,
reset: AtomicBool,
}
impl StreamState {
pub(crate) fn new() -> Self {
Self {
read_open: AtomicBool::new(true),
write_open: AtomicBool::new(true),
reset: AtomicBool::new(false),
}
}
pub(crate) fn read_open(&self) -> bool {
self.read_open.load(Ordering::Acquire)
}
pub(crate) fn write_open(&self) -> bool {
self.write_open.load(Ordering::Acquire)
}
pub(crate) fn is_reset(&self) -> bool {
self.reset.load(Ordering::Acquire)
}
pub(crate) fn close_read(&self) -> bool {
self.read_open.swap(false, Ordering::AcqRel)
}
pub(crate) fn close_write(&self) -> bool {
self.write_open.swap(false, Ordering::AcqRel)
}
pub(crate) fn mark_reset(&self) -> bool {
let first = !self.reset.swap(true, Ordering::AcqRel);
self.read_open.store(false, Ordering::Release);
self.write_open.store(false, Ordering::Release);
first
}
}