use std::sync::atomic::{
AtomicU8,
Ordering,
};
use qubit_executor::service::ExecutorServiceLifecycle;
pub(crate) fn load(lifecycle: &AtomicU8) -> ExecutorServiceLifecycle {
from_u8(lifecycle.load(Ordering::Acquire))
}
pub(crate) fn shutdown(lifecycle: &AtomicU8) {
let _ = lifecycle.fetch_update(Ordering::AcqRel, Ordering::Acquire, |current| {
(from_u8(current) == ExecutorServiceLifecycle::Running)
.then_some(ExecutorServiceLifecycle::ShuttingDown as u8)
});
}
pub(crate) fn stop(lifecycle: &AtomicU8) {
lifecycle.store(ExecutorServiceLifecycle::Stopping as u8, Ordering::Release);
}
fn from_u8(value: u8) -> ExecutorServiceLifecycle {
const STATES: [ExecutorServiceLifecycle; 4] = [
ExecutorServiceLifecycle::Running,
ExecutorServiceLifecycle::ShuttingDown,
ExecutorServiceLifecycle::Stopping,
ExecutorServiceLifecycle::Terminated,
];
STATES[usize::from(value.min(ExecutorServiceLifecycle::Terminated as u8))]
}