Fix tasks not always running correctly on boot/sleep/wake/shutdown

This commit is contained in:
Luke D. Jones
2022-12-08 20:12:55 +13:00
parent 07daa0df61
commit 245c035dc9
8 changed files with 125 additions and 80 deletions

View File

@@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
## [v4.5.6-RC1]
- Fix tasks not always running correctly on boot/sleep/wake/shutdown by finishing the move to async
## [v4.5.5] ## [v4.5.5]
- remove an unwrap() causing panic on main ROGCC thread - remove an unwrap() causing panic on main ROGCC thread

18
Cargo.lock generated
View File

@@ -149,7 +149,7 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]] [[package]]
name = "asusctl" name = "asusctl"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"daemon", "daemon",
"gif", "gif",
@@ -727,7 +727,7 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
[[package]] [[package]]
name = "daemon" name = "daemon"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"concat-idents", "concat-idents",
@@ -750,7 +750,7 @@ dependencies = [
[[package]] [[package]]
name = "daemon-user" name = "daemon-user"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"dirs", "dirs",
"rog_anime", "rog_anime",
@@ -2593,7 +2593,7 @@ dependencies = [
[[package]] [[package]]
name = "rog-control-center" name = "rog-control-center"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"daemon", "daemon",
"dirs", "dirs",
@@ -2623,7 +2623,7 @@ dependencies = [
[[package]] [[package]]
name = "rog_anime" name = "rog_anime"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"gif", "gif",
"glam", "glam",
@@ -2638,7 +2638,7 @@ dependencies = [
[[package]] [[package]]
name = "rog_aura" name = "rog_aura"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",
@@ -2649,7 +2649,7 @@ dependencies = [
[[package]] [[package]]
name = "rog_dbus" name = "rog_dbus"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"rog_anime", "rog_anime",
"rog_aura", "rog_aura",
@@ -2660,7 +2660,7 @@ dependencies = [
[[package]] [[package]]
name = "rog_platform" name = "rog_platform"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"concat-idents", "concat-idents",
"inotify", "inotify",
@@ -2676,7 +2676,7 @@ dependencies = [
[[package]] [[package]]
name = "rog_profiles" name = "rog_profiles"
version = "4.5.5" version = "4.5.6-RC1"
dependencies = [ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",

View File

@@ -2,7 +2,7 @@
members = ["asusctl", "daemon", "daemon-user", "rog-platform", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center"] members = ["asusctl", "daemon", "daemon-user", "rog-platform", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center"]
[workspace.package] [workspace.package]
version = "4.5.5" version = "4.5.6-RC1"
[workspace.dependencies] [workspace.dependencies]
async-trait = "^0.1" async-trait = "^0.1"

View File

@@ -166,28 +166,32 @@ impl crate::CtrlTask for CtrlAnimeZbus {
self.create_sys_event_tasks( self.create_sys_event_tasks(
// Loop is required to try an attempt to get the mutex *without* blocking // Loop is required to try an attempt to get the mutex *without* blocking
// other threads - it is possible to end up with deadlocks otherwise. // other threads - it is possible to end up with deadlocks otherwise.
move || loop { move || {
if let Some(lock) = inner1.try_lock() { let inner1 = inner1.clone();
async move {
let lock = inner1.lock().await;
run_action(true, lock, inner1.clone()); run_action(true, lock, inner1.clone());
break;
} }
}, },
move || loop { move || {
if let Some(lock) = inner2.try_lock() { let inner2 = inner2.clone();
run_action(false, lock, inner2.clone()); async move {
break; let lock = inner2.lock().await;
run_action(true, lock, inner2.clone());
} }
}, },
move || loop { move || {
if let Some(lock) = inner3.try_lock() { let inner3 = inner3.clone();
async move {
let lock = inner3.lock().await;
run_action(true, lock, inner3.clone()); run_action(true, lock, inner3.clone());
break;
} }
}, },
move || loop { move || {
if let Some(lock) = inner4.try_lock() { let inner4 = inner4.clone();
run_action(false, lock, inner4.clone()); async move {
break; let lock = inner4.lock().await;
run_action(true, lock, inner4.clone());
} }
}, },
) )

View File

@@ -262,28 +262,32 @@ impl CtrlTask for CtrlKbdLedZbus {
self.create_sys_event_tasks( self.create_sys_event_tasks(
// Loop so that we do aquire the lock but also don't block other // Loop so that we do aquire the lock but also don't block other
// threads (prevents potential deadlocks) // threads (prevents potential deadlocks)
move || loop { move || {
if let Some(lock) = inner1.try_lock() { let inner1 = inner1.clone();
async move {
let lock = inner1.lock().await;
load_save(true, lock); load_save(true, lock);
break;
} }
}, },
move || loop { move || {
if let Some(lock) = inner2.try_lock() { let inner2 = inner2.clone();
async move {
let lock = inner2.lock().await;
load_save(false, lock); load_save(false, lock);
break;
} }
}, },
move || loop { move || {
if let Some(lock) = inner3.try_lock() { let inner3 = inner3.clone();
load_save(true, lock); async move {
break; let lock = inner3.lock().await;
} load_save(false, lock);
}, }
move || loop { },
if let Some(lock) = inner4.try_lock() { move || {
let inner4 = inner4.clone();
async move {
let lock = inner4.lock().await;
load_save(false, lock); load_save(false, lock);
break;
} }
}, },
) )

View File

@@ -332,10 +332,12 @@ impl CtrlTask for CtrlPlatform {
let platform1 = self.clone(); let platform1 = self.clone();
let platform2 = self.clone(); let platform2 = self.clone();
self.create_sys_event_tasks( self.create_sys_event_tasks(
move || {}, move || async { {} },
move || { move || {
info!("CtrlRogBios reloading panel_od"); let platform1 = platform1.clone();
if let Some(lock) = platform1.config.try_lock() { async move {
info!("CtrlRogBios reloading panel_od");
let lock = platform1.config.lock().await;
if platform1.platform.has_panel_od() { if platform1.platform.has_panel_od() {
platform1 platform1
.set_panel_overdrive(lock.panel_od) .set_panel_overdrive(lock.panel_od)
@@ -347,10 +349,12 @@ impl CtrlTask for CtrlPlatform {
} }
} }
}, },
move || {}, move || async { {} },
move || { move || {
info!("CtrlRogBios reloading panel_od"); let platform2 = platform2.clone();
if let Some(lock) = platform2.config.try_lock() { async move {
info!("CtrlRogBios reloading panel_od");
let lock = platform2.config.lock().await;
if platform2.platform.has_panel_od() { if platform2.platform.has_panel_od() {
platform2 platform2
.set_panel_overdrive(lock.panel_od) .set_panel_overdrive(lock.panel_od)

View File

@@ -155,10 +155,12 @@ impl CtrlTask for CtrlPower {
let power1 = self.clone(); let power1 = self.clone();
let power2 = self.clone(); let power2 = self.clone();
self.create_sys_event_tasks( self.create_sys_event_tasks(
move || {}, move || async {},
move || { move || {
info!("CtrlCharge reloading charge limit"); let power1 = power1.clone();
if let Some(lock) = power1.config.try_lock() { async move {
info!("CtrlCharge reloading charge limit");
let lock = power1.config.lock().await;
power1 power1
.set(lock.bat_charge_limit) .set(lock.bat_charge_limit)
.map_err(|err| { .map_err(|err| {
@@ -166,22 +168,25 @@ impl CtrlTask for CtrlPower {
err err
}) })
.ok(); .ok();
}
if let Ok(value) = power1.power.get_online() { if let Ok(value) = power1.power.get_online() {
let action = if value == 1 { let action = if value == 1 {
SystemdUnitAction::Restart SystemdUnitAction::Restart
} else { } else {
SystemdUnitAction::Stop SystemdUnitAction::Stop
}; };
if do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() { if do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() {
info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}"); info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}");
}
} }
} }
}, },
move || {}, move || async {},
move || { move || {
info!("CtrlCharge reloading charge limit"); let power2 = power2.clone();
if let Some(lock) = power2.config.try_lock() { async move {
info!("CtrlCharge reloading charge limit");
let lock = power2.config.lock().await;
power2 power2
.set(lock.bat_charge_limit) .set(lock.bat_charge_limit)
.map_err(|err| { .map_err(|err| {
@@ -189,15 +194,16 @@ impl CtrlTask for CtrlPower {
err err
}) })
.ok(); .ok();
}
if let Ok(value) = power2.power.get_online() { if let Ok(value) = power2.power.get_online() {
let action = if value == 1 { let action = if value == 1 {
SystemdUnitAction::Restart SystemdUnitAction::Restart
} else { } else {
SystemdUnitAction::Stop SystemdUnitAction::Stop
}; };
if do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() { if do_systemd_unit_action(action, NVIDIA_POWERD).is_ok() {
info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}"); info!("CtrlPower task: did {action:?} on {NVIDIA_POWERD}");
}
} }
} }
}, },

View File

@@ -21,9 +21,11 @@ pub mod ctrl_supported;
pub mod error; pub mod error;
use std::future::Future;
use crate::error::RogError; use crate::error::RogError;
use async_trait::async_trait; use async_trait::async_trait;
use log::warn; use log::{debug, warn};
use logind_zbus::manager::ManagerProxy; use logind_zbus::manager::ManagerProxy;
use zbus::{export::futures_util::StreamExt, zvariant::ObjectPath, Connection, SignalContext}; use zbus::{export::futures_util::StreamExt, zvariant::ObjectPath, Connection, SignalContext};
@@ -134,13 +136,31 @@ pub trait CtrlTask {
/// ///
/// The closures can potentially block, so execution time should be the minimal possible /// The closures can potentially block, so execution time should be the minimal possible
/// such as save a variable. /// such as save a variable.
async fn create_sys_event_tasks( async fn create_sys_event_tasks<
Fut1,
Fut2,
Fut3,
Fut4,
F1: Send + 'static,
F2: Send + 'static,
F3: Send + 'static,
F4: Send + 'static,
>(
&self, &self,
mut on_sleep: impl FnMut() + Send + 'static, mut on_sleep: F1,
mut on_wake: impl FnMut() + Send + 'static, mut on_wake: F2,
mut on_shutdown: impl FnMut() + Send + 'static, mut on_shutdown: F3,
mut on_boot: impl FnMut() + Send + 'static, mut on_boot: F4,
) { ) where
F1: FnMut() -> Fut1,
F2: FnMut() -> Fut2,
F3: FnMut() -> Fut3,
F4: FnMut() -> Fut4,
Fut1: Future<Output = ()> + Send,
Fut2: Future<Output = ()> + Send,
Fut3: Future<Output = ()> + Send,
Fut4: Future<Output = ()> + Send,
{
let connection = Connection::system() let connection = Connection::system()
.await .await
.expect("Controller could not create dbus connection"); .expect("Controller could not create dbus connection");
@@ -154,9 +174,11 @@ pub trait CtrlTask {
while let Some(event) = notif.next().await { while let Some(event) = notif.next().await {
if let Ok(args) = event.args() { if let Ok(args) = event.args() {
if args.start { if args.start {
on_sleep(); debug!("Doing on_sleep()");
on_sleep().await;
} else if !args.start() { } else if !args.start() {
on_wake(); debug!("Doing on_wake()");
on_wake().await;
} }
} }
} }
@@ -172,9 +194,11 @@ pub trait CtrlTask {
while let Some(event) = notif.next().await { while let Some(event) = notif.next().await {
if let Ok(args) = event.args() { if let Ok(args) = event.args() {
if args.start { if args.start {
on_shutdown(); debug!("Doing on_shutdown()");
on_shutdown().await;
} else if !args.start() { } else if !args.start() {
on_boot(); debug!("Doing on_boot()");
on_boot().await;
} }
} }
} }