Nothing to see here, move along
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}