🚏 Stopping Point
🛑 Interrupt
🚏 Stop
No Interruptibility
fn execute(
params: Params,
) -> Outcome {
let output_1 = step_1(params);
let output_2 = step_2(output_1);
let outcome = step_3(output_2);
return outcome;
}
Basic
fn execute(
interrupt_rx: mut Receiver<InterruptSignal>,
params: Params,
) -> ControlFlow<InterruptSignal, Outcome> {
let () = interruptibility_check(&mut interrupt_rx)?;
let output_1 = step_1(params);
let () = interruptibility_check(&mut interrupt_rx)?;
let output_2 = step_2(output_1);
let () = interruptibility_check(&mut interrupt_rx)?;
let outcome = step_3(output_2);
ControlFlow::Continue(outcome)
}
fn interruptibility_check(receiver: &mut Receiver<InterruptSignal>)
-> ControlFlow<InterruptSignal, ()> {
if let Ok(interrupt_signal) = interrupt_rx.try_recv() {
ControlFlow::Continue(())
} else {
ControlFlow::Break(interrupt_signal)
}
}
Fine Grained Interruptibility
fn execute(
interrupt_rx: mut Receiver<InterruptSignal>,
params: Params,
) -> ControlFlow<InterruptSignal, Outcome> {
let () = interruptibility_check(&mut interrupt_rx)?;
let output_1 = step_1(&mut interrupt_rx, params);
// ..
}
fn step_1(
interrupt_rx: mut Receiver<InterruptSignal>,
params: Params,
) -> ControlFlow<Output1, Outcome> {
let mut output_1 = Output1::new();
for i in 0..1_000_000 {
if i % 1_000 == 0 {
let () = interruptibility_check(&mut interrupt_rx)?;
}
do_something(output_1, params, i);
}
ControlFlow::Continue(output_1)
}