1- use std:: sync:: { Arc , LazyLock } ;
1+ use std:: sync:: LazyLock ;
22
3- use parking_lot:: Mutex ;
43use seelen_core:: system_state:: { Battery , PowerMode , PowerStatus } ;
54use windows:: Win32 :: {
65 Foundation :: HANDLE ,
@@ -22,22 +21,16 @@ use crate::{
2221 error:: { Result , ResultLogExt } ,
2322 event_manager,
2423 modules:: power:: domain:: power_mode_to_serializable,
25- trace_lock ,
24+ utils :: lock_free :: TracedMutex ,
2625 windows_api:: { event_window:: subscribe_to_background_window, WindowsApi } ,
2726} ;
2827
2928use super :: domain:: { battery_to_slu_battery, power_status_to_serializable} ;
3029
31- static POWER_MANAGER : LazyLock < Arc < Mutex < PowerManager > > > = LazyLock :: new ( || {
32- let mut pm = PowerManager :: new ( ) ;
33- pm. init ( ) . log_error ( ) ;
34- Arc :: new ( Mutex :: new ( pm) )
35- } ) ;
36-
3730#[ derive( Debug ) ]
3831pub struct PowerManager {
3932 pub power_status : PowerStatus ,
40- pub current_power_mode : PowerMode ,
33+ pub power_mode : PowerMode ,
4134 pub batteries : Vec < Battery > ,
4235
4336 power_setting_battery_percent_token : Option < HPOWERNOTIFY > ,
@@ -47,7 +40,12 @@ pub struct PowerManager {
4740event_manager ! ( PowerManager , PowerManagerEvent ) ;
4841
4942impl PowerManager {
50- pub fn instance ( ) -> & ' static Arc < Mutex < Self > > {
43+ pub fn instance ( ) -> & ' static TracedMutex < Self > {
44+ static POWER_MANAGER : LazyLock < TracedMutex < PowerManager > > = LazyLock :: new ( || {
45+ let mut pm = PowerManager :: new ( ) ;
46+ pm. init ( ) . log_error ( ) ;
47+ TracedMutex :: new ( pm)
48+ } ) ;
5149 & POWER_MANAGER
5250 }
5351
@@ -60,6 +58,22 @@ impl PowerManager {
6058 self . power_status = Self :: get_power_status ( ) ?;
6159 self . batteries = Self :: get_batteries ( ) ?;
6260
61+ let eid = Self :: subscribe ( |event| {
62+ let mut guard = Self :: instance ( ) . lock ( ) ;
63+ match event {
64+ PowerManagerEvent :: BatteriesChanged ( batteries) => {
65+ guard. batteries = batteries;
66+ }
67+ PowerManagerEvent :: PowerStatusChanged ( status) => {
68+ guard. power_status = status;
69+ }
70+ PowerManagerEvent :: PowerModeChanged ( mode) => {
71+ guard. power_mode = mode;
72+ }
73+ }
74+ } ) ;
75+ Self :: set_event_handler_priority ( & eid, 1 ) ;
76+
6377 // https://learn.microsoft.com/en-us/windows/win32/api/powersetting/nf-powersetting-powerregisterforeffectivepowermodenotifications#remarks
6478 unsafe {
6579 let mut unregister_token_ptr = std:: ptr:: null_mut ( ) ;
@@ -101,11 +115,11 @@ impl PowerManager {
101115 mode : EFFECTIVE_POWER_MODE ,
102116 _ctx : * const std:: ffi:: c_void ,
103117 ) {
104- let mut guard = trace_lock ! ( POWER_MANAGER ) ;
118+ let mut guard = Self :: instance ( ) . lock ( ) ;
105119 let mode: PowerMode = power_mode_to_serializable ( mode) ;
106- if guard. current_power_mode != mode {
120+ if guard. power_mode != mode {
107121 log:: trace!( "Power mode changed to {mode:?}" ) ;
108- guard. current_power_mode = mode;
122+ guard. power_mode = mode;
109123 Self :: send ( PowerManagerEvent :: PowerModeChanged ( mode) ) ;
110124 }
111125 }
@@ -143,15 +157,13 @@ impl PowerManager {
143157
144158 match w_param as u32 {
145159 PBT_APMPOWERSTATUSCHANGE => {
146- let mut guard = trace_lock ! ( POWER_MANAGER ) ;
147160 let new_status = Self :: get_power_status ( ) ?;
148- if guard. power_status . ac_line_status != new_status. ac_line_status {
149- let batteries = Self :: get_batteries ( ) ?;
150- guard. batteries = batteries. clone ( ) ;
151- Self :: send ( PowerManagerEvent :: BatteriesChanged ( batteries) ) ;
161+ if Self :: instance ( ) . lock ( ) . power_status . ac_line_status != new_status. ac_line_status
162+ {
163+ Self :: send ( PowerManagerEvent :: BatteriesChanged ( Self :: get_batteries ( ) ?) ) ;
152164 }
165+
153166 log:: trace!( "Power status changed to {new_status:?}" ) ;
154- guard. power_status = new_status. clone ( ) ;
155167 Self :: send ( PowerManagerEvent :: PowerStatusChanged ( new_status) ) ;
156168 }
157169 PBT_APMRESUMESUSPEND | PBT_APMRESUMEAUTOMATIC => {
@@ -163,20 +175,12 @@ impl PowerManager {
163175
164176 log:: trace!( "Refreshing power state after wake up" ) ;
165177 if let Ok ( new_status) = Self :: get_power_status ( ) {
166- let mut guard = trace_lock ! ( POWER_MANAGER ) ;
167- guard. power_status = new_status. clone ( ) ;
168178 Self :: send ( PowerManagerEvent :: PowerStatusChanged ( new_status) ) ;
169179 }
170180
171181 if let Ok ( batteries) = Self :: get_batteries ( ) {
172- let mut guard = trace_lock ! ( POWER_MANAGER ) ;
173- guard. batteries = batteries. clone ( ) ;
174182 Self :: send ( PowerManagerEvent :: BatteriesChanged ( batteries) ) ;
175183 }
176-
177- let guard = trace_lock ! ( POWER_MANAGER ) ;
178- let current_mode = guard. current_power_mode ;
179- Self :: send ( PowerManagerEvent :: PowerModeChanged ( current_mode) ) ;
180184 } ) ;
181185 }
182186 _ => { }
@@ -198,7 +202,7 @@ impl Default for PowerManager {
198202 fn default ( ) -> Self {
199203 Self {
200204 power_status : power_status_to_serializable ( SYSTEM_POWER_STATUS :: default ( ) ) ,
201- current_power_mode : PowerMode :: Unknown ,
205+ power_mode : PowerMode :: Unknown ,
202206 batteries : Vec :: new ( ) ,
203207 power_mode_event_token : None ,
204208 power_setting_battery_percent_token : None ,
0 commit comments