mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Fix tasks not always running correctly on boot/sleep/wake/shutdown
This commit is contained in:
@@ -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
18
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user