battery/gpu: Fix freezing after udev-event
This commit is contained in:
parent
1ad07dc2f3
commit
ee04d486fa
1 changed files with 38 additions and 32 deletions
|
|
@ -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 => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue