use std::{collections::HashSet, ops::DerefMut, sync::Mutex};
use static_init::dynamic;
use zenoh_core::zlock;
use crate::{posix_shm::cleanup::cleanup_orphaned_segments, shm::Segment};
#[dynamic(lazy, drop)]
pub(crate) static mut CLEANUP: Cleanup = Cleanup::new();
pub(crate) struct Cleanup {
cleanups: Mutex<HashSet<u64>>,
}
impl Cleanup {
fn new() -> Self {
cleanup_orphaned_segments();
Self {
cleanups: Default::default(),
}
}
pub(crate) fn register_cleanup<ID: crate::shm::SegmentID>(&self, id: ID) {
let mut lock = zlock!(self.cleanups);
lock.insert(id.into());
}
pub(crate) fn unregister_cleanup<ID: crate::shm::SegmentID>(&self, id: ID) {
let mut lock = zlock!(self.cleanups);
lock.remove(&id.into());
}
fn cleanup(&self) {
let ids = {
let mut lock = zlock!(self.cleanups);
std::mem::take(lock.deref_mut())
};
for id in ids {
Segment::ensure_not_persistent(id);
}
}
}
impl Drop for Cleanup {
fn drop(&mut self) {
cleanup_orphaned_segments();
self.cleanup();
}
}