use std::sync::atomic::AtomicU32;
use std::sync::atomic::Ordering;
use std::sync::Arc;
use ccp_shared::types::LogicalCoreId;
use parking_lot::Mutex;
#[derive(Clone)]
pub struct CpuIdsHandle(Arc<CpuIdsHandleInner>);
impl CpuIdsHandle {
pub fn new(initial_state: Vec<LogicalCoreId>) -> Self {
Self(Arc::new(CpuIdsHandleInner {
cpu_ids: Mutex::new(initial_state),
version: AtomicU32::new(0),
}))
}
pub fn get_cores(&self) -> Vec<LogicalCoreId> {
let guard = self.0.cpu_ids.lock();
(*guard).clone()
}
pub fn set_cores(&self, new_state: Vec<LogicalCoreId>) {
let mut guard = self.0.cpu_ids.lock();
self.0.version.fetch_add(1, Ordering::Relaxed);
*guard = new_state;
}
pub fn get_version_relaxed(&self) -> u32 {
self.0.version.load(Ordering::Relaxed)
}
}
struct CpuIdsHandleInner {
cpu_ids: Mutex<Vec<LogicalCoreId>>,
version: AtomicU32,
}