use {
crate::state::State,
std::{
cell::Cell,
os::fd::OwnedFd,
rc::Rc,
sync::{
Arc,
atomic::{
AtomicBool,
Ordering::{Relaxed, Release},
},
},
},
};
pub struct Destructor {
pub(super) state: Rc<State>,
pub(super) enabled: Cell<bool>,
}
pub struct RemoteDestructor {
pub(super) destroy: Arc<AtomicBool>,
pub(super) _fd: OwnedFd,
pub(super) enabled: AtomicBool,
}
impl Destructor {
pub fn state(&self) -> &Rc<State> {
&self.state
}
pub fn enabled(&self) -> bool {
self.enabled.get()
}
pub fn enable(&self) {
self.enabled.set(true);
}
pub fn disable(&self) {
self.enabled.set(false);
}
}
impl Drop for Destructor {
fn drop(&mut self) {
if self.enabled.get() {
self.state.destroy();
}
}
}
impl RemoteDestructor {
pub fn enabled(&self) -> bool {
self.enabled.load(Relaxed)
}
pub fn enable(&self) {
self.enabled.store(true, Relaxed);
}
pub fn disable(&self) {
self.enabled.store(false, Relaxed);
}
}
impl Drop for RemoteDestructor {
fn drop(&mut self) {
if self.enabled.load(Relaxed) {
self.destroy.store(true, Release);
}
}
}