use std::{
ptr::null_mut,
sync::{
Arc,
atomic::{AtomicPtr, Ordering},
},
};
use crate::{Pid, topology::Topology};
static SHARED_ACCESS: AtomicPtr<SharedAccess> = AtomicPtr::new(null_mut());
pub(crate) fn setup_shared_access(topology: Arc<Topology>) {
let sa = Box::new(SharedAccess::new(topology));
let ptr = Box::into_raw(sa);
SHARED_ACCESS.store(ptr, Ordering::Release);
}
fn shared() -> &'static SharedAccess {
let ptr = SHARED_ACCESS.load(Ordering::Acquire);
unsafe { &*ptr }
}
#[derive(Debug)]
struct SharedAccess {
topology: Arc<Topology>,
}
impl SharedAccess {
fn new(topology: Arc<Topology>) -> Self {
Self { topology }
}
}
pub fn list_pool(pool_name: &str) -> &'static [Pid] {
shared().topology.list_pool(pool_name)
}
pub(crate) fn reset() {
let old = SHARED_ACCESS.swap(null_mut(), Ordering::Release);
unsafe {
drop(Box::from_raw(old));
}
}