Skip to content

Commit 766f346

Browse files
authored
Simplify shutdown with cancellation tokens (#601)
1 parent d30dd6f commit 766f346

File tree

11 files changed

+48
-89
lines changed

11 files changed

+48
-89
lines changed

daemon/src/display/generic_framebuffer.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ use rayhunter::analysis::analyzer::EventType;
99

1010
use log::{error, info};
1111
use tokio::sync::mpsc::Receiver;
12-
use tokio::sync::oneshot;
13-
use tokio::sync::oneshot::error::TryRecvError;
14-
use tokio_util::task::TaskTracker;
12+
use tokio_util::{sync::CancellationToken, task::TaskTracker};
1513

1614
use include_dir::{Dir, include_dir};
1715

@@ -173,7 +171,7 @@ pub fn update_ui(
173171
task_tracker: &TaskTracker,
174172
config: &config::Config,
175173
mut fb: impl GenericFramebuffer,
176-
mut ui_shutdown_rx: oneshot::Receiver<()>,
174+
shutdown_token: CancellationToken,
177175
mut ui_update_rx: Receiver<DisplayState>,
178176
) {
179177
static IMAGE_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/images/");
@@ -204,13 +202,9 @@ pub fn update_ui(
204202
);
205203
}
206204
loop {
207-
match ui_shutdown_rx.try_recv() {
208-
Ok(_) => {
209-
info!("received UI shutdown");
210-
break;
211-
}
212-
Err(TryRecvError::Empty) => {}
213-
Err(e) => panic!("error receiving shutdown message: {e}"),
205+
if shutdown_token.is_cancelled() {
206+
info!("received UI shutdown");
207+
break;
214208
}
215209
match ui_update_rx.try_recv() {
216210
Ok(state) => {

daemon/src/display/headless.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use log::info;
22
use tokio::sync::mpsc::Receiver;
3-
use tokio::sync::oneshot;
3+
use tokio_util::sync::CancellationToken;
44
use tokio_util::task::TaskTracker;
55

66
use crate::config;
@@ -9,7 +9,7 @@ use crate::display::DisplayState;
99
pub fn update_ui(
1010
_task_tracker: &TaskTracker,
1111
_config: &config::Config,
12-
_ui_shutdown_rx: oneshot::Receiver<()>,
12+
_shutdown_token: CancellationToken,
1313
_ui_update_rx: Receiver<DisplayState>,
1414
) {
1515
info!("Headless mode, not spawning UI.");

daemon/src/display/orbic.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::display::generic_framebuffer::{self, Dimensions, GenericFramebuffer};
44
use async_trait::async_trait;
55

66
use tokio::sync::mpsc::Receiver;
7-
use tokio::sync::oneshot;
7+
use tokio_util::sync::CancellationToken;
88
use tokio_util::task::TaskTracker;
99

1010
const FB_PATH: &str = "/dev/fb0";
@@ -38,14 +38,14 @@ impl GenericFramebuffer for Framebuffer {
3838
pub fn update_ui(
3939
task_tracker: &TaskTracker,
4040
config: &config::Config,
41-
ui_shutdown_rx: oneshot::Receiver<()>,
41+
shutdown_token: CancellationToken,
4242
ui_update_rx: Receiver<DisplayState>,
4343
) {
4444
generic_framebuffer::update_ui(
4545
task_tracker,
4646
config,
4747
Framebuffer,
48-
ui_shutdown_rx,
48+
shutdown_token,
4949
ui_update_rx,
5050
)
5151
}

daemon/src/display/tmobile.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
/// DisplayState::WarningDetected { .. } => Signal LED slowly blinks red.
55
use log::{error, info};
66
use tokio::sync::mpsc;
7-
use tokio::sync::oneshot;
7+
use tokio_util::sync::CancellationToken;
88
use tokio_util::task::TaskTracker;
99

1010
use std::time::Duration;
@@ -27,7 +27,7 @@ async fn stop_blinking(path: String) {
2727
pub fn update_ui(
2828
task_tracker: &TaskTracker,
2929
config: &config::Config,
30-
mut ui_shutdown_rx: oneshot::Receiver<()>,
30+
shutdown_token: CancellationToken,
3131
mut ui_update_rx: mpsc::Receiver<DisplayState>,
3232
) {
3333
let mut invisible: bool = false;
@@ -40,13 +40,9 @@ pub fn update_ui(
4040
let mut last_state = DisplayState::Paused;
4141

4242
loop {
43-
match ui_shutdown_rx.try_recv() {
44-
Ok(_) => {
45-
info!("received UI shutdown");
46-
break;
47-
}
48-
Err(oneshot::error::TryRecvError::Empty) => {}
49-
Err(e) => panic!("error receiving shutdown message: {e}"),
43+
if shutdown_token.is_cancelled() {
44+
info!("received UI shutdown");
45+
break;
5046
}
5147
match ui_update_rx.try_recv() {
5248
Ok(new_state) => state = new_state,

daemon/src/display/tplink.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use log::info;
22
use tokio::sync::mpsc::Receiver;
3-
use tokio::sync::oneshot;
3+
use tokio_util::sync::CancellationToken;
44
use tokio_util::task::TaskTracker;
55

66
use crate::config;
@@ -11,7 +11,7 @@ use std::fs;
1111
pub fn update_ui(
1212
task_tracker: &TaskTracker,
1313
config: &config::Config,
14-
ui_shutdown_rx: oneshot::Receiver<()>,
14+
shutdown_token: CancellationToken,
1515
ui_update_rx: Receiver<DisplayState>,
1616
) {
1717
let display_level = config.ui_level;
@@ -23,9 +23,9 @@ pub fn update_ui(
2323
// The alternative would be to make the entire initialization async
2424
if fs::exists(tplink_onebit::OLED_PATH).unwrap_or_default() {
2525
info!("detected one-bit display");
26-
tplink_onebit::update_ui(task_tracker, config, ui_shutdown_rx, ui_update_rx)
26+
tplink_onebit::update_ui(task_tracker, config, shutdown_token, ui_update_rx)
2727
} else {
2828
info!("fallback to framebuffer");
29-
tplink_framebuffer::update_ui(task_tracker, config, ui_shutdown_rx, ui_update_rx)
29+
tplink_framebuffer::update_ui(task_tracker, config, shutdown_token, ui_update_rx)
3030
}
3131
}

daemon/src/display/tplink_framebuffer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ use async_trait::async_trait;
22
use std::os::fd::AsRawFd;
33
use tokio::fs::OpenOptions;
44
use tokio::io::AsyncWriteExt;
5+
use tokio_util::sync::CancellationToken;
56

67
use crate::config;
78
use crate::display::DisplayState;
89
use crate::display::generic_framebuffer::{self, Dimensions, GenericFramebuffer};
910

1011
use tokio::sync::mpsc::Receiver;
11-
use tokio::sync::oneshot;
1212
use tokio_util::task::TaskTracker;
1313

1414
const FB_PATH: &str = "/dev/fb0";
@@ -80,14 +80,14 @@ impl GenericFramebuffer for Framebuffer {
8080
pub fn update_ui(
8181
task_tracker: &TaskTracker,
8282
config: &config::Config,
83-
ui_shutdown_rx: oneshot::Receiver<()>,
83+
shutdown_token: CancellationToken,
8484
ui_update_rx: Receiver<DisplayState>,
8585
) {
8686
generic_framebuffer::update_ui(
8787
task_tracker,
8888
config,
8989
Framebuffer,
90-
ui_shutdown_rx,
90+
shutdown_token,
9191
ui_update_rx,
9292
)
9393
}

daemon/src/display/tplink_onebit.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ use crate::display::DisplayState;
66

77
use log::{error, info};
88
use tokio::sync::mpsc::Receiver;
9-
use tokio::sync::oneshot;
10-
use tokio::sync::oneshot::error::TryRecvError;
9+
use tokio_util::sync::CancellationToken;
1110
use tokio_util::task::TaskTracker;
1211

1312
use std::time::Duration;
@@ -112,7 +111,7 @@ const STATUS_WARNING: &[u8] = pixelart! {
112111
pub fn update_ui(
113112
task_tracker: &TaskTracker,
114113
config: &config::Config,
115-
mut ui_shutdown_rx: oneshot::Receiver<()>,
114+
shutdown_token: CancellationToken,
116115
mut ui_update_rx: Receiver<DisplayState>,
117116
) {
118117
let display_level = config.ui_level;
@@ -124,13 +123,9 @@ pub fn update_ui(
124123
let mut pixels = STATUS_SMILING;
125124

126125
loop {
127-
match ui_shutdown_rx.try_recv() {
128-
Ok(_) => {
129-
info!("received UI shutdown");
130-
break;
131-
}
132-
Err(TryRecvError::Empty) => {}
133-
Err(e) => panic!("error receiving shutdown message: {e}"),
126+
if shutdown_token.is_cancelled() {
127+
info!("received UI shutdown");
128+
break;
134129
}
135130

136131
match ui_update_rx.try_recv() {

daemon/src/display/uz801.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
/// DisplayState::WarningDetected => Signal LED is solid red.
55
use log::{error, info};
66
use tokio::sync::mpsc;
7-
use tokio::sync::oneshot;
7+
use tokio_util::sync::CancellationToken;
88
use tokio_util::task::TaskTracker;
99

1010
use std::time::Duration;
@@ -27,7 +27,7 @@ async fn led_off(path: String) {
2727
pub fn update_ui(
2828
task_tracker: &TaskTracker,
2929
config: &config::Config,
30-
mut ui_shutdown_rx: oneshot::Receiver<()>,
30+
shutdown_token: CancellationToken,
3131
mut ui_update_rx: mpsc::Receiver<DisplayState>,
3232
) {
3333
let mut invisible: bool = false;
@@ -41,13 +41,9 @@ pub fn update_ui(
4141
let mut last_update = std::time::Instant::now();
4242

4343
loop {
44-
match ui_shutdown_rx.try_recv() {
45-
Ok(_) => {
46-
info!("received UI shutdown");
47-
break;
48-
}
49-
Err(oneshot::error::TryRecvError::Empty) => {}
50-
Err(e) => panic!("error receiving shutdown message: {e}"),
44+
if shutdown_token.is_cancelled() {
45+
info!("received UI shutdown");
46+
break;
5147
}
5248
match ui_update_rx.try_recv() {
5349
Ok(new_state) => state = new_state,

daemon/src/display/wingtech.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::display::generic_framebuffer::{self, Dimensions, GenericFramebuffer};
1010
use async_trait::async_trait;
1111

1212
use tokio::sync::mpsc::Receiver;
13-
use tokio::sync::oneshot;
13+
use tokio_util::sync::CancellationToken;
1414
use tokio_util::task::TaskTracker;
1515

1616
const FB_PATH: &str = "/dev/fb0";
@@ -43,14 +43,14 @@ impl GenericFramebuffer for Framebuffer {
4343
pub fn update_ui(
4444
task_tracker: &TaskTracker,
4545
config: &config::Config,
46-
ui_shutdown_rx: oneshot::Receiver<()>,
46+
shutdown_token: CancellationToken,
4747
ui_update_rx: Receiver<DisplayState>,
4848
) {
4949
generic_framebuffer::update_ui(
5050
task_tracker,
5151
config,
5252
Framebuffer,
53-
ui_shutdown_rx,
53+
shutdown_token,
5454
ui_update_rx,
5555
)
5656
}

daemon/src/key_input.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::time::{Duration, Instant};
33
use tokio::fs::File;
44
use tokio::io::AsyncReadExt;
55
use tokio::sync::mpsc::Sender;
6-
use tokio::sync::oneshot;
6+
use tokio_util::sync::CancellationToken;
77
use tokio_util::task::TaskTracker;
88

99
use crate::config;
@@ -21,7 +21,7 @@ pub fn run_key_input_thread(
2121
task_tracker: &TaskTracker,
2222
config: &config::Config,
2323
diag_tx: Sender<DiagDeviceCtrlMessage>,
24-
mut ui_shutdown_rx: oneshot::Receiver<()>,
24+
cancellation_token: CancellationToken,
2525
) {
2626
if config.key_input_mode == 0 {
2727
return;
@@ -43,7 +43,7 @@ pub fn run_key_input_thread(
4343

4444
loop {
4545
tokio::select! {
46-
_ = &mut ui_shutdown_rx => {
46+
_ = cancellation_token.cancelled() => {
4747
info!("received key input shutdown");
4848
return;
4949
}

0 commit comments

Comments
 (0)