capsules_system/
process_policies.rs1use kernel::process;
12use kernel::process::Process;
13use kernel::process::ProcessFaultPolicy;
14
15pub struct PanicFaultPolicy {}
17
18impl ProcessFaultPolicy for PanicFaultPolicy {
19 fn action(&self, _: &dyn Process) -> process::FaultAction {
20 process::FaultAction::Panic
21 }
22}
23
24pub struct StopFaultPolicy {}
26
27impl ProcessFaultPolicy for StopFaultPolicy {
28 fn action(&self, _: &dyn Process) -> process::FaultAction {
29 process::FaultAction::Stop
30 }
31}
32
33pub struct StopWithDebugFaultPolicy {}
37
38impl ProcessFaultPolicy for StopWithDebugFaultPolicy {
39 fn action(&self, process: &dyn Process) -> process::FaultAction {
40 kernel::debug!(
41 "Process {} faulted and was stopped.",
42 process.get_process_name()
43 );
44 process::FaultAction::Stop
45 }
46}
47
48pub struct RestartFaultPolicy {}
50
51impl ProcessFaultPolicy for RestartFaultPolicy {
52 fn action(&self, _: &dyn Process) -> process::FaultAction {
53 process::FaultAction::Restart
54 }
55}
56
57pub struct RestartWithDebugFaultPolicy {}
59
60impl ProcessFaultPolicy for RestartWithDebugFaultPolicy {
61 fn action(&self, process: &dyn Process) -> process::FaultAction {
62 kernel::debug!(
63 "Process {} faulted and will be restarted.",
64 process.get_process_name()
65 );
66 process::FaultAction::Restart
67 }
68}
69
70pub struct ThresholdRestartFaultPolicy {
76 threshold: usize,
77}
78
79impl ThresholdRestartFaultPolicy {
80 pub const fn new(threshold: usize) -> ThresholdRestartFaultPolicy {
81 ThresholdRestartFaultPolicy { threshold }
82 }
83}
84
85impl ProcessFaultPolicy for ThresholdRestartFaultPolicy {
86 fn action(&self, process: &dyn Process) -> process::FaultAction {
87 if process.get_restart_count() <= self.threshold {
88 process::FaultAction::Restart
89 } else {
90 process::FaultAction::Stop
91 }
92 }
93}
94
95pub struct ThresholdRestartThenPanicFaultPolicy {
101 threshold: usize,
102}
103
104impl ThresholdRestartThenPanicFaultPolicy {
105 pub const fn new(threshold: usize) -> ThresholdRestartThenPanicFaultPolicy {
106 ThresholdRestartThenPanicFaultPolicy { threshold }
107 }
108}
109
110impl ProcessFaultPolicy for ThresholdRestartThenPanicFaultPolicy {
111 fn action(&self, process: &dyn Process) -> process::FaultAction {
112 if process.get_restart_count() <= self.threshold {
113 process::FaultAction::Restart
114 } else {
115 process::FaultAction::Panic
116 }
117 }
118}