D-Bus best practices
Thiago Macieira
thiago at kde.org
Mon Apr 20 12:32:04 PDT 2009
Em Segunda-feira 20 Abril 2009, às 19:13:45, Avery Pennarun escreveu:
> On Mon, Apr 20, 2009 at 12:40 PM, Schmottlach, Glenn
>
> <glenn.schmottlach at harman.com> wrote:
> > The reality, however, is that those folks who have tackled a
> > language/framework binding (like you) or actually implemented the D-Bus
> > reference implementation are probably in the best position to offer
> > advice on how to do things correctly.
>
> This is not exactly true. The people who've been doing it the longest
> probably know how to do things best, but the closer you become to a
> project, the harder it becomes to remember which parts other people
> find difficult.
>
> In my experience, the best documentation is written by people as
> they're learning, since they understand the problems of other people
> trying to learn.
>
> (If there are errors, well, someone can come in and fix them :))
I'd agree with that.
I don't know where I'd start. There are a couple of things that I can think of
because they show up very frequently either here or on the #dbus channel. But
other than that...
Anyways, here's a suggested list of topics to address:
1) cross-compilation
It seems every month there's someone new running into x-comp. problems.
At least people seem to have figured out "make DESTDIR=.... install"
2) main-loop integration
If you want to receive spontaneous messages (such as signals or incoming
calls) and send messages, you have no other option than to use a mainloop
integration. Any other implementation (usually using the
dbus_connection_read_write call) either results in dead-locks or arbitrary
timeouts (waking up every 100ms or so).
3) introspection
Anybody using libdbus-1 is forced to write their XML for introspection and
has to do so manually. The library doesn't help you write the XML.
Worse yet: if you have a sub-hierarchy, you have to remember to add the
<node> elements.
(In retrospect, the Introspect call should have returned "sas" so that the
list of sub-nodes is an easy-to-parse array, which could be added by the
library without expensive modification of the XML data)
4) discovery of services
I've seen many people introspecting the entire object path hierarchy in a
service or, even worse, all services, to find a given interface. That's the
wrong approach and we should encourage people to do it the right way: by
having a well-known path in a service and, if necessary, registering a well-
known service name too.
5) object lifetime (a.k.a. finding out when to release resources)
Best practices regarding listening for the NameOwnerChanged signal to decide
when a remote client has exited and, thus, a temporary object should be
released. Should also include some suggestions on how to explicitly notify
the server that the service is no longer necessary.
6) API design
a) roundtrips: D-Bus APIs should be designed for maximum information in the
smallest number of round-trips, so API designers should avoid making several
calls to collect information. It's cheaper to send information that isn't
necessary than to make extra calls for information that is.
b) timeouts: D-Bus method calls *do* timeout. There's no way around this, so
any call that can potentially take some time to execute should be designed in
a call/callback pattern: the call replies whether the action was initiated
and a signal reports the end result.
[This is an area where the protocol itself could use future improvement]
c) synchronous vs asynchronous API: the libdbus-1 library and most bindings
offer asynchronous method calls, which allow a call to be sent and other
operations executed while the call reply doesn't come. This is recommended to
avoid deadlocks when the callee can directly or indirectly call back to
complete its operation.
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Senior Product Manager - Nokia, Qt Software
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: 189 bytes
Desc: This is a digitally signed message part.
Url : http://lists.freedesktop.org/archives/dbus/attachments/20090420/f315d8dc/attachment.pgp
More information about the dbus
mailing list