Nothing to see here, move along
at main 56 lines 1.6 kB view raw
1use crate::error::KernelError; 2 3#[derive(Debug, Clone, Copy, PartialEq, Eq)] 4#[repr(u8)] 5pub enum ProcessState { 6 Free = 0, 7 Ready = 1, 8 Running = 2, 9 Blocked = 3, 10 Dead = 4, 11 Created = 5, 12 Zombie = 6, 13} 14 15impl ProcessState { 16 pub const ALL: [ProcessState; 7] = [ 17 Self::Free, 18 Self::Ready, 19 Self::Running, 20 Self::Blocked, 21 Self::Dead, 22 Self::Created, 23 Self::Zombie, 24 ]; 25 26 pub fn is_valid_transition(from: ProcessState, to: ProcessState) -> bool { 27 matches!( 28 (from, to), 29 (Self::Free, Self::Created) 30 | (Self::Created, Self::Ready) 31 | (Self::Ready, Self::Running) 32 | (Self::Running, Self::Ready) 33 | (Self::Running, Self::Blocked) 34 | (Self::Blocked, Self::Ready) 35 | (Self::Running, Self::Dead) 36 | (Self::Ready, Self::Dead) 37 | (Self::Blocked, Self::Dead) 38 | (Self::Created, Self::Dead) 39 | (Self::Dead, Self::Free) 40 | (Self::Running, Self::Zombie) 41 | (Self::Ready, Self::Zombie) 42 | (Self::Blocked, Self::Zombie) 43 | (Self::Created, Self::Zombie) 44 | (Self::Zombie, Self::Free) 45 ) 46 } 47 48 pub fn transition(&mut self, to: ProcessState) -> Result<(), KernelError> { 49 if Self::is_valid_transition(*self, to) { 50 *self = to; 51 Ok(()) 52 } else { 53 Err(KernelError::BadState) 54 } 55 } 56}