Skip to content

Commit

Permalink
cmd/watcher: fix termination races
Browse files Browse the repository at this point in the history
  • Loading branch information
kortschak committed May 25, 2024
1 parent af222fd commit 867fb74
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
11 changes: 6 additions & 5 deletions cmd/watcher/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,11 @@ func (d *daemon) dial(ctx context.Context, network, addr string, dialer net.Dial
}

func (d *daemon) close() error {
d.pMu.Lock()
defer d.pMu.Unlock()
d.conn.Notify(context.Background(), rpc.Unregister, rpc.NewMessage(rpc.UID{Module: d.uid}, rpc.None{}))
return errors.Join(
closeCloser(d.detailer),
closeCloser(d.timezone),
d.conn.Close(),
)
Expand Down Expand Up @@ -333,11 +336,9 @@ func (d *daemon) replaceDetailer(ctx context.Context, strategy string) {
d.log.LogAttrs(ctx, slog.LevelError, "configure", slog.Any("error", err))
return
}
if c, ok := d.detailer.(io.Closer); ok {
err = c.Close()
if err != nil {
d.log.LogAttrs(ctx, slog.LevelWarn, "configure", slog.Any("error", err))
}
err = closeCloser(d.detailer)
if err != nil {
d.log.LogAttrs(ctx, slog.LevelWarn, "configure", slog.Any("error", err))
}
d.log.LogAttrs(ctx, slog.LevelInfo, "configure", slog.String("strategy", det.strategy()))
d.detailer = det
Expand Down
17 changes: 15 additions & 2 deletions cmd/watcher/poll_dbus_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package main
import (
"encoding/json"
"errors"
"sync"
"time"

"github.com/godbus/dbus/v5"
Expand All @@ -27,19 +28,31 @@ func newMutterDetailer() (detailer, error) {
}

type mutterDetailer struct {
mu sync.Mutex
conn *dbus.Conn
last time.Time
}

func (*mutterDetailer) strategy() string { return "gnome/mutter" }

func (d *mutterDetailer) Close() error {
err := d.conn.Close()
d.conn = nil
d.mu.Lock()
var err error
if d.conn != nil {
err = d.conn.Close()
d.conn = nil
}
d.mu.Unlock()
return err
}

func (d *mutterDetailer) details() (watcher.Details, error) {
d.mu.Lock()
defer d.mu.Unlock()
if d.conn == nil {
return watcher.Details{}, errors.New("closed")
}

locked, errLocked := dbusCall[bool](d.conn,
"org.gnome.ScreenSaver",
"/org/gnome/ScreenSaver",
Expand Down

0 comments on commit 867fb74

Please sign in to comment.