D-BUS implementing DCOP - some minor problems?
David A. Wheeler
dwheeler@dwheeler.com
Mon Jan 24 21:17:33 PST 2005
I spent a little time comparing the DCOP and D-BUS documents,
to see if DCOP could be re-implemented using D-BUS.
In a very few areas, the current D-BUS draft doesn't seem to currently
support what's needed to reimplement DCOP (which would really
simplify transition if KDE decided to do it), or at least I
wasn't sure. The problems do look like they'd
be trivial to solve. Here are the potential semantic mismatches
I could find, please let me know if I'm mistaken:
* DCOP method names include not just the name as you'd expect,
but the parameter list using the local type names.
For example, "doIt(int)" is treated as a method name in DCOP.
In contrast, D-BUS doesn't permit parentheses or commas in
method names -- D-BUS would use "doIt" as the method name.
Also, note that method names "doIt(uint)" and "doIt(pid_t)"
are _different_ in DCOP (they're considered completely
different methods, even if the underlying types sent over
the wire are the same). It's not clear if this
kind of differentiation is actually employed.
Recipients of a DCOP call DIRECTLY compare for equality against
these longer strings (e.g., they compare to see if they
received a call for "doIt(int)")... so DCOP APIs are
required to provide these longer names to the message receiver.
That's important, because that means that if D-BUS simply
strips off the parameters (e.g., "(pid_t)") to create a
legal D-BUS message name, there's no way on the DCOP
recipient end to reconstruct the message in a way
that the recipient will understand it.
For a simple transition, D-BUS would somehow need to
have a way to transfer the parameter list types in the message.
This could be done by relaxing the rules on message names
(so "doIt(int)" is legal, as well as "doIt"). This would allow
D-BUS to directly support the same approach used by DCOP.
Another solution would be to define a new field to capture the
parameter list ('parms' field "(int)" or whatever), so that
this DCOP data would be included in the message.
You _could_ handle this by quietly adding a new parameter in
the body with this info, but I think that'd be really ugly...
that kind of info belongs in the header, not the body.
* The DCOP "send" interface doesn't
indicate whether or not a reply is expected, so it's hard to
set the relevant D-BUS flag with confidence.
However, send by itself doesn't block, so it could probably
just always set NO_REPLY_EXPECTED; the recipient could ignore that
flag if they really have data to reply. The problem here is that
DCOP doesn't provide enough data, but it's not clear that this
would really cause any trouble.
* DCOP has two different kinds of connectors, "volatile" and
"non-volatile". For volatile connections, if a sender
OR receiver is deleted, the connection is deleted.
It's not clear to me from the current D-BUS documents
how signal recipients are selected, so it's hard to
determine if D-BUS can do enough.
The DCOP documents seem to imply that signals are only
sent to a single recipient
("It can be connected to _a_ function..."), but I doubt that's
actually true (if true, that's a very unfortunate limitation
that D-BUS can get rid of).
* DCOP's "send" can actually do a broadcast to a set of applications,
e.g., sending to 'konsole-*' will send to all apps called console.
D-BUS should implement a 'limited broadcast'; I wouldn't be
surprised if it does, I just don't see anything about it.
It doesn't appear that "send" should send a signal, because
it CAN receive replies.
According to the DCOP documentation "You cannot call() a method
belonging to an application which has registered with a unique
numeric id appended to its textual name..." -- if that's true,
that's an unfortunate weakness in DCOP that D-BUS corrects.
I suspect I'm misunderstanding something here though.
For the most part, it looks like DCOP could be implemented on
top of D-BUS, which would clearly make a KDE transition to D-BUS
(if that's what KDE decides to do) _much_ easier.
ASYNC calls seem to cleanly map to the NO_REPLY_EXPECTED flag.
Object names don't begin with "/" in calls to the
DCOP API, but the DCOP-to-DBUS binding could insert "/org/kde"
prefixes to objects not beginning with "/" when calling to D-BUS,
and reverse that when sending data back. As noted by Waldo Bastian,
D-BUS has a "more flexible design of DBUS wrt async message
handling and thread support"
(http://lists.freedesktop.org/archives/dbus/2004-October/001665.html),
so many things look 'at least as capable'.
One suggestion: perhaps the D-BUS term "Bus Name" should be changed to
"Application Name" or "Application ID", like DCOP.
I find the DCOP name for this field far easier to understand
and explain. It's also good for explaining and contrasting
DCOP/D-BUS with different mechanisms like CORBA and DCE.
--- David A. Wheeler
More information about the dbus
mailing list