use crate::error::KernelError; #[derive(Debug, Clone, Copy, PartialEq, Eq)] #[repr(u8)] pub enum ProcessState { Free = 0, Ready = 1, Running = 2, Blocked = 3, Dead = 4, Created = 5, Zombie = 6, } impl ProcessState { pub const ALL: [ProcessState; 7] = [ Self::Free, Self::Ready, Self::Running, Self::Blocked, Self::Dead, Self::Created, Self::Zombie, ]; pub fn is_valid_transition(from: ProcessState, to: ProcessState) -> bool { matches!( (from, to), (Self::Free, Self::Created) | (Self::Created, Self::Ready) | (Self::Ready, Self::Running) | (Self::Running, Self::Ready) | (Self::Running, Self::Blocked) | (Self::Blocked, Self::Ready) | (Self::Running, Self::Dead) | (Self::Ready, Self::Dead) | (Self::Blocked, Self::Dead) | (Self::Created, Self::Dead) | (Self::Dead, Self::Free) | (Self::Running, Self::Zombie) | (Self::Ready, Self::Zombie) | (Self::Blocked, Self::Zombie) | (Self::Created, Self::Zombie) | (Self::Zombie, Self::Free) ) } pub fn transition(&mut self, to: ProcessState) -> Result<(), KernelError> { if Self::is_valid_transition(*self, to) { *self = to; Ok(()) } else { Err(KernelError::BadState) } } }