battery/gpu: Fix freezing after udev-event

This commit is contained in:
Victoria Brekenfeld 2024-02-06 18:26:27 +01:00
parent 1ad07dc2f3
commit ee04d486fa

View file

@ -412,12 +412,13 @@ async fn start_listening(
.map(|(_, i, _)| i); .map(|(_, i, _)| i);
tokio::select! { tokio::select! {
_guard = monitor.monitor.readable() => { guard = monitor.monitor.readable() => {
for event in monitor.monitor.get_ref().0.iter() { if let Ok(mut guard) = guard {
match event.event_type() { for event in monitor.monitor.get_ref().0.iter() {
// New device match event.event_type() {
EventType::Add => { // New device
if let Some(path) = event.devnode() { EventType::Add => {
if let Some(path) = event.devnode() {
let device = event.device(); let device = event.device();
let name = if let Some(parent) = device.parent() { let name = if let Some(parent) = device.parent() {
let vendor = parent let vendor = parent
@ -438,40 +439,45 @@ async fn start_listening(
} }
} else { } else {
String::from("Unknown GPU") String::from("Unknown GPU")
}; };
let mut device = Some(device); let mut device = Some(device);
let driver = loop { let driver = loop {
if let Some(dev) = device { if let Some(dev) = device {
if dev.driver().is_some() { if dev.driver().is_some() {
break dev.driver().map(std::ffi::OsStr::to_os_string); break dev.driver().map(std::ffi::OsStr::to_os_string);
} else {
device = dev.parent();
}
} else { } else {
device = dev.parent(); break None;
} }
} else { };
break None;
}
};
let mut interval = time::interval(Duration::from_secs(3)); let mut interval = time::interval(Duration::from_secs(3));
interval.set_missed_tick_behavior(time::MissedTickBehavior::Delay); interval.set_missed_tick_behavior(time::MissedTickBehavior::Delay);
monitor.gpus.push(Gpu { monitor.gpus.push(Gpu {
path: path.to_path_buf(), path: path.to_path_buf(),
name, name,
primary: false, primary: false,
enabled: false, enabled: false,
driver, driver,
interval, interval,
}); });
} }
}, },
EventType::Remove => { EventType::Remove => {
if let Some(path) = event.devnode() { if let Some(path) = event.devnode() {
monitor.gpus.retain(|gpu| gpu.path != path); monitor.gpus.retain(|gpu| gpu.path != path);
}
} }
_ => {},
} }
_ => {},
} }
guard.clear_ready_matching(tokio::io::Ready::READABLE);
} else {
return State::Finished;
} }
} }
i = select_all => { i = select_all => {