Clarification on some bus behaviour

Thiago Macieira thiago at kde.org
Wed Sep 8 02:56:13 PDT 2010


Hello all

While trying to profile the QtDBus binding on an ARM board (yes, I have to deal 
with those too), I found out that the binding spends 18 ms during the 
connection startup doing the following:

dbus_bus_add_match("destination='insert my own unique connection here'");
dbus_bus_add_match("type='signal',sender='org.freedesktop.DBus',member='NameAcquired'");
dbus_bus_add_match("type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0='org.freedesktop.DBus'");
blocking call to GetNameOwner("org.freedesktop.DBus")
dbus_bus_add_match("type='signal',sender='org.freedesktop.DBus',member='NameLost'");

Now, the interesting thing is that, with the reference implementation of the 
dbus-daemon, I *know* that all of the above are useless. These calls are there 
because my reading of the spec tells me that they are necessary.

So, I have three questions that need clarification:

1) Is the application allowed to assume that the bus will send all messages 
that have this connection as a destination, without having to add a match rule 
for it? In other words, can I drop that first add_match above?

I would think that the answer here is Yes. This rule should be implicit. 
There's also a race condition here, if this weren't the case: another process 
could send my application a message at the moment that my unique name appeared 
on the bus, but before I had a chance to add the rule. If the rule weren't 
present, the message would not be delivered.

Another aspect is that the caller has the guarantee from the bus that any 
directed message (anything but a signal) will either:
 a) be delivered to exactly one (non-eavesdropping) destination
 b) be returned with org.freedesktop.DBus.Error.ServiceUnknown

If a connection is allowed to exist without the rule for its destination, 
directed messages could disappear into the ether...

2) Is the application allowed to assume that the bus will always send the 
NameAcquired and NameLost signals without having to add a match rule for it? 
In other words, can I drop the second and fourth add_match calls above?

I would think that the answer here is also Yes.

These two signals are special in that they are the only kinds of directed 
signals. They are delivered exclusively to the connection that acquired or 
lost a name. By the rule above that directed messages are always delivered to 
their destination, I would conclude that these two signals are always 
delivered.

3) Is the application allowed to assume anything about the owner of the 
org.freedesktop.DBus name?

I think the answer here is No.

The reference dbus-daemon has the owner of org.freedesktop.DBus as also 
org.freedesktop.DBus, even though that's not a unique connection name. I could 
think of a different implementation using something like :0 or :1.0 as the 
unique name.

Therefore, I'd say that a binding must not assume anything about the actual 
owner of the bus service. That GetNameOwner call of mine must still be there.

However, it should be ok to assume that the name never changes owners, so the 
third add_match of mine can be skipped.

-- 
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
  Senior Product Manager - Nokia, Qt Development Frameworks
      PGP/GPG: 0x6EF45358; fingerprint:
      E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/dbus/attachments/20100908/cb6d5212/attachment.pgp>


More information about the dbus mailing list