Skip to content

Commit 423a014

Browse files
author
Stephan Dilly
authored
allow input error to be logged and abort program (#693)
1 parent 43d125b commit 423a014

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

src/input.rs

+40-28
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use crate::notify_mutex::NotifyableMutex;
2-
use crossbeam_channel::{unbounded, Receiver};
2+
use anyhow::Result;
3+
use crossbeam_channel::{unbounded, Receiver, Sender};
34
use crossterm::event::{self, Event};
45
use std::{
6+
process,
57
sync::{
68
atomic::{AtomicBool, Ordering},
79
Arc,
@@ -44,33 +46,12 @@ impl Input {
4446
let arc_desired = Arc::clone(&desired_state);
4547
let arc_current = Arc::clone(&current_state);
4648

47-
thread::spawn(move || loop {
48-
if arc_desired.get() {
49-
if !arc_current.load(Ordering::Relaxed) {
50-
log::info!("input polling resumed");
51-
52-
tx.send(InputEvent::State(InputState::Polling))
53-
.expect("send state failed");
54-
}
55-
arc_current.store(true, Ordering::Relaxed);
56-
57-
if let Some(e) = Self::poll(POLL_DURATION)
58-
.expect("failed to pull events.")
59-
{
60-
tx.send(InputEvent::Input(e))
61-
.expect("send input failed");
62-
}
63-
} else {
64-
if arc_current.load(Ordering::Relaxed) {
65-
log::info!("input polling suspended");
66-
67-
tx.send(InputEvent::State(InputState::Paused))
68-
.expect("send state failed");
69-
}
70-
71-
arc_current.store(false, Ordering::Relaxed);
72-
73-
arc_desired.wait(true);
49+
thread::spawn(move || {
50+
if let Err(e) =
51+
Self::input_loop(&arc_desired, &arc_current, &tx)
52+
{
53+
log::error!("input thread error: {}", e);
54+
process::abort();
7455
}
7556
});
7657

@@ -108,4 +89,35 @@ impl Input {
10889
Ok(None)
10990
}
11091
}
92+
93+
fn input_loop(
94+
arc_desired: &Arc<NotifyableMutex<bool>>,
95+
arc_current: &Arc<AtomicBool>,
96+
tx: &Sender<InputEvent>,
97+
) -> Result<()> {
98+
loop {
99+
if arc_desired.get() {
100+
if !arc_current.load(Ordering::Relaxed) {
101+
log::info!("input polling resumed");
102+
103+
tx.send(InputEvent::State(InputState::Polling))?;
104+
}
105+
arc_current.store(true, Ordering::Relaxed);
106+
107+
if let Some(e) = Self::poll(POLL_DURATION)? {
108+
tx.send(InputEvent::Input(e))?;
109+
}
110+
} else {
111+
if arc_current.load(Ordering::Relaxed) {
112+
log::info!("input polling suspended");
113+
114+
tx.send(InputEvent::State(InputState::Paused))?
115+
}
116+
117+
arc_current.store(false, Ordering::Relaxed);
118+
119+
arc_desired.wait(true);
120+
}
121+
}
122+
}
111123
}

0 commit comments

Comments
 (0)