Skip to content

Commit afaa487

Browse files
committed
dbus: use separate connection for signals
1 parent c5023e7 commit afaa487

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

dbus/dbus.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,14 @@ func PathBusEscape(path string) string {
6464

6565
// Conn is a connection to systemd's dbus endpoint.
6666
type Conn struct {
67+
// sysconn/sysobj are only used to call dbus methods
6768
sysconn *dbus.Conn
6869
sysobj *dbus.Object
6970

71+
// sigconn/sigobj are only used to receive dbus signals
72+
sigconn *dbus.Conn
73+
sigobj *dbus.Object
74+
7075
jobListener struct {
7176
jobs map[dbus.ObjectPath]chan string
7277
sync.Mutex
@@ -97,16 +102,23 @@ func newConnection(createBus func() (*dbus.Conn, error)) (*Conn, error) {
97102
return nil, err
98103
}
99104

105+
sigconn, err := dbusConnection(createBus)
106+
if err != nil {
107+
return nil, err
108+
}
109+
100110
c := &Conn{
101111
sysconn: sysconn,
102112
sysobj: systemdObject(sysconn),
113+
sigconn: sigconn,
114+
sigobj: systemdObject(sigconn),
103115
}
104116

105117
c.subscriber.ignore = make(map[dbus.ObjectPath]int64)
106118
c.jobListener.jobs = make(map[dbus.ObjectPath]chan string)
107119

108120
// Setup the listeners on jobs so that we can get completions
109-
c.sysconn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0,
121+
c.sigconn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0,
110122
"type='signal', interface='org.freedesktop.systemd1.Manager', member='JobRemoved'")
111123

112124
c.dispatch()

dbus/subscription.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ const (
3333
// systemd will automatically stop sending signals so there is no need to
3434
// explicitly call Unsubscribe().
3535
func (c *Conn) Subscribe() error {
36-
c.sysconn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0,
36+
c.sigconn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0,
3737
"type='signal',interface='org.freedesktop.systemd1.Manager',member='UnitNew'")
38-
c.sysconn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0,
38+
c.sigconn.BusObject().Call("org.freedesktop.DBus.AddMatch", 0,
3939
"type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'")
4040

41-
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.Subscribe", 0).Store()
41+
err := c.sigobj.Call("org.freedesktop.systemd1.Manager.Subscribe", 0).Store()
4242
if err != nil {
4343
return err
4444
}
@@ -48,7 +48,7 @@ func (c *Conn) Subscribe() error {
4848

4949
// Unsubscribe this connection from systemd dbus events.
5050
func (c *Conn) Unsubscribe() error {
51-
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.Unsubscribe", 0).Store()
51+
err := c.sigobj.Call("org.freedesktop.systemd1.Manager.Unsubscribe", 0).Store()
5252
if err != nil {
5353
return err
5454
}
@@ -59,7 +59,7 @@ func (c *Conn) Unsubscribe() error {
5959
func (c *Conn) dispatch() {
6060
ch := make(chan *dbus.Signal, signalBuffer)
6161

62-
c.sysconn.Signal(ch)
62+
c.sigconn.Signal(ch)
6363

6464
go func() {
6565
for {

0 commit comments

Comments
 (0)