dscale 0.5.3

A fast & deterministic simulation framework for benchmarking and testing distributed systems
Documentation
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 }
    }
}

/// Returns a slice of all process pids in the named pool.
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));
    }
}