Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 40 additions & 13 deletions bin/dde-session-daemon/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
package main

import (
"errors"
"fmt"
"os"
"strings"
"sync"

"github.com/godbus/dbus/v5"
"github.com/linuxdeepin/dde-api/session"
"github.com/linuxdeepin/dde-daemon/calltrace"
"github.com/linuxdeepin/dde-daemon/loader"
dbusmgr "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus"
"github.com/linuxdeepin/go-gir/glib-2.0"
"github.com/linuxdeepin/go-lib/dbusutil"
"github.com/linuxdeepin/go-lib/gsettings"
Expand Down Expand Up @@ -252,14 +252,44 @@ func (s *SessionDaemon) getAllDefaultDisabledModules() []string {

func (s *SessionDaemon) execDefaultAction() {
var err error
if hasDDECookie {
// start part1
err = loader.EnableModules(s.part1EnabledModules, s.part1DisabledModules, 0)
session.Register()

} else {
err = loader.EnableModules(s.getAllDefaultEnabledModules(),
s.getAllDefaultDisabledModules(), getEnableFlag(s.flags))
err = loader.EnableModules(s.part1EnabledModules, s.part1DisabledModules, 0)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (complexity): Consider extracting the DBus and signal loop logic from execDefaultAction into a dedicated helper to keep the function focused and readable.

Suggested change
err = loader.EnableModules(s.part1EnabledModules, s.part1DisabledModules, 0)
The new DBus/signalloop logic in `execDefaultAction` is adding a lot of noise. You can pull it into a small helper (e.g. `sessionWatcher`) and keep `execDefaultAction` focused:
--- session_watcher.go ---
```go
package main
import (
"sync"
"github.com/godbus/dbus/v5"
dbusmgr "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus"
"github.com/linuxdeepin/go-lib/dbusutil"
)
type sessionWatcher struct {
once sync.Once
mgr *dbusmgr.DBus
loop *dbusutil.SignalLoop
}
func newSessionWatcher(conn *dbus.Conn) *sessionWatcher {
loop := dbusutil.NewSignalLoop(conn, 10)
loop.Start()
mgr := dbusmgr.NewDBus(conn)
mgr.InitSignalExt(loop, true)
return &sessionWatcher{mgr: mgr, loop: loop}
}
// Start invokes `onStarted` once when the name appears (or already exists).
func (w *sessionWatcher) Start(onStarted func()) error {
handler, err := w.mgr.ConnectNameOwnerChanged(func(name, _, newOwner string) {
if name == "org.deepin.dde.SessionManager1" && newOwner != "" {
w.once.Do(func() {
onStarted()
w.mgr.RemoveHandler(handler)
})
}
})
if err != nil {
return err
}
ok, err := w.mgr.NameHasOwner(0, "org.deepin.dde.SessionManager1")
if err != nil {
return err
}
if ok {
w.once.Do(func() {
onStarted()
w.mgr.RemoveHandler(handler)
})
}
return nil
}

Then simplify execDefaultAction:

func (s *SessionDaemon) execDefaultAction() {
    if err := loader.EnableModules(s.part1EnabledModules, s.part1DisabledModules, 0); err != nil {
        logger.Warning("Failed to enable part1 modules:", err)
        os.Exit(3)
    }

    conn, _ := dbus.SessionBus()
    watcher := newSessionWatcher(conn)
    if err := watcher.Start(s.StartPart2); err != nil {
        logger.Warning("session watcher setup failed:", err)
        os.Exit(3)
    }
}

This keeps all functionality, reduces nesting in execDefaultAction, and moves DBus details into a focused helper.

if err != nil {
logger.Warning("Failed to enable part1 modules:", err)
os.Exit(3)
}
var once sync.Once

sessionBus, _ := dbus.SessionBus()
dbusDaemon := dbusmgr.NewDBus(sessionBus)
sessionSigLoop := dbusutil.NewSignalLoop(sessionBus, 10)
sessionSigLoop.Start()
dbusDaemon.InitSignalExt(sessionSigLoop, true)
var handler dbusutil.SignalHandlerId
handler, err = dbusDaemon.ConnectNameOwnerChanged(func(name, oldOwner, newOwner string) {
if name == "org.deepin.dde.SessionManager1" {
if len(newOwner) != 0 {
logger.Info("org.deepin.dde.SessionManager1 is starting")
once.Do(func() {
s.StartPart2()
dbusDaemon.RemoveHandler(handler)
})
}
}
})
if err != nil {
logger.Warning(err)
}

ok, err := dbusDaemon.NameHasOwner(0, "org.deepin.dde.SessionManager1")
if err != nil {
logger.Warning("Failed to check org.deepin.dde.SessionManager1 owner:", err)
os.Exit(3)
}
if ok {
once.Do(func() {
s.StartPart2()
dbusDaemon.RemoveHandler(handler)
})
}

if err != nil {
Expand Down Expand Up @@ -306,9 +336,6 @@ func (s *SessionDaemon) CallTrace(times, seconds uint32) *dbus.Error {
}

func (s *SessionDaemon) StartPart2() *dbus.Error {
if !hasDDECookie {
return dbusutil.ToError(errors.New("env DDE_SESSION_PROCESS_COOKIE_ID is empty"))
}
// start part2
err := loader.EnableModules(s.part2EnabledModules, s.part2DisabledModules, 0)
return dbusutil.ToError(err)
Expand Down
Loading