Skip to content

Commit

Permalink
fix: 优化sleep前后处理逻辑
Browse files Browse the repository at this point in the history
由于待机、休眠唤醒前后,login1 session的active状态可能发生变化,在收到HandleForSleep时,可能SessionWatcher的IsActive还没有变更,两个信号先后顺序不可控,因此调整为待机休眠前判断当前session状态,唤醒后只需要判断是否执行过待机休眠前的操作即可

Log: 优化sleep前后处理逻辑
Bug: https://pms.uniontech.com/bug-view-250075.html
Influence: sleep唤醒后处理
Change-Id: Icf092317419633abf9be72929261c1e3660111ed
  • Loading branch information
lichangze committed Apr 10, 2024
1 parent c3a5f7b commit 4c96605
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions session/power/sleep_inhibit.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,23 @@
package power

import (
"github.com/linuxdeepin/dde-daemon/appearance"
"github.com/linuxdeepin/dde-daemon/network"
"syscall"

"github.com/godbus/dbus"
"github.com/linuxdeepin/dde-daemon/appearance"
"github.com/linuxdeepin/dde-daemon/network"
daemon "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.daemon"
ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus"
login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1"
"github.com/linuxdeepin/go-lib/dbusutil"
)

type sleepInhibitor struct {
loginManager login1.Manager
fd int
dbusObj ofdbus.DBus
sysLoop *dbusutil.SignalLoop
loginManager login1.Manager
fd int
dbusObj ofdbus.DBus
sysLoop *dbusutil.SignalLoop
hasRunBeforeSleep bool

OnWakeup func()
OnBeforeSuspend func()
Expand All @@ -41,14 +42,19 @@ func newSleepInhibitor(login1Manager login1.Manager, daemon daemon.Daemon) *slee
inhibitor.sysLoop.Start()
inhibitor.dbusObj.InitSignalExt(inhibitor.sysLoop, true)
_, err = daemon.ConnectHandleForSleep(func(before bool) {
logger.Info("login1 HandleForSleep", before)
logger.Info("sleepInhibitor HandleForSleep", before)
// signal `HandleForSleep` true -> false
if !_manager.sessionActive {
// 如果此用户此时不是活跃状态,则不处理待机唤醒信号.
return
}

if before {
_manager.PropsMu.Lock()
if !_manager.sessionActive {
logger.Debug("sessionActive is false,don't need run before sleep")
_manager.PropsMu.Unlock()
// 如果此用户此时不是活跃状态,则不处理待机唤醒信号.
return
}
_manager.PropsMu.Unlock()

inhibitor.hasRunBeforeSleep = true
// TODO(jouyouyun): implement 'HandleForSleep' register
appearance.HandlePrepareForSleep(true)
network.HandlePrepareForSleep(true)
Expand All @@ -62,6 +68,10 @@ func newSleepInhibitor(login1Manager login1.Manager, daemon daemon.Daemon) *slee
logger.Warning(err)
}
} else {
if !inhibitor.hasRunBeforeSleep {
logger.Debug("not run before sleep,don't need run after sleep")
return
}
suspendPulseSources(0)
suspendPulseSinks(0)
if inhibitor.OnWakeup != nil {
Expand All @@ -78,6 +88,7 @@ func newSleepInhibitor(login1Manager login1.Manager, daemon daemon.Daemon) *slee
if err != nil {
logger.Warning(err)
}
inhibitor.hasRunBeforeSleep = false
}
})
if err != nil {
Expand Down

0 comments on commit 4c96605

Please sign in to comment.