C-API Examples

Kosina, Martin martin.kosina at intel.com
Mon May 8 10:43:47 PDT 2006


Havoc wrote:
>I don't see the return_val_if_fail in it right now?
>http://webcvs.freedesktop.org/dbus/dbus/dbus/dbus-connection.c?

Yep you are right, I worked against the 0.61 release before, all synced
up now.

>In short dispatching is about processing the message queue by calling 
>registered handlers. This is distinct from reading/writing 
>stuff off the 
>socket into the message queue.
...

Ok, thanks - that is very helpful conceptual overview, its all starting
to make sense. I got Matt's example to work, although I am still seeing
some unexplained weirdness under Windows/MSVC7 (the server never gets
any messages from the bus when its compiled in Debug mode). Performance
is ~1400 calls/sec client<->bus<->server on 750K iterations over
loopback TCP on a 2.3GHz Centrino Thinkpad (WinXP SP2).

>  - if you are only dealing with dbus, read_write_dispatch() can be
used
>    to create a trivial dbus-only mainloop like
>    "while (read_write_dispatch()) { ; }"

That would be the case (dbus-only scenario) - trouble is, this ends up
being a tight loop, pegging the CPU. Any good bare-bones C samples I
could refer to for setting up/using the loops and watches? I am not that
familiar with Glib or Qt, so reverse-engineering the existing bindings
has been slooow.


Thanks !!

Martin


>-----Original Message-----
>From: Havoc Pennington [mailto:hp at redhat.com] 
>Sent: Thursday, May 04, 2006 20:50
>To: Kosina, Martin
>Cc: dbus at lists.freedesktop.org
>Subject: Re: C-API Examples
>
>Kosina, Martin wrote:
>> 
>> Matt wrote:
>>> http://www.matthew.ath.cx/misc/dbus/ is one that I compiled when I
>>> worked it out while writing a simple app and the Java bindings.
>> 
>> Thanks - that is very helpful. I can get everything to 
>connect/register
>> on the bus, but it seems that _dbus_connection_read_write_dispatch()
>> never does any reading (so the send/receive or listen/query 
>pairs never
>> exchange anything). (It seems status is always 
>DBUS_DISPATCH_COMPLETED
>> after the initial exchange, hence
>> _dbus_connection_do_iteration_unlocked() never gets 
>subsequently called
>> ?) I put a breakpoint at _dbus_read() and it never gets hit...
>> 
>> Has anyone tried these recently ? I suspect something might have
>> changed, because _dbus_connection_read_write_dispatch() 
>doesn't even run
>> without some //hacking due to a call to _dbus_return_val_if_fail(),
>> which appears to assert that the function call does not start with an
>> '_' (leading me to believe its been a while since this 
>actually worked -
>> but perhaps I am missing something simple ?).
>
>I don't see the return_val_if_fail in it right now?
>http://webcvs.freedesktop.org/dbus/dbus/dbus/dbus-connection.c?
>rev=1.118&view=markup
>
>On the larger question: DBUS_DISPATCH_COMPLETED is not related to 
>reading or writing. The overview docs for DBusConnection talk a bit 
>about what the dispatch status means:
>http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.
>html#_details
>See also the docs on read_write_dispatch:
>http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.
>html#g7843e31742a11e0551a52f18370d8c8e
>
>In short dispatching is about processing the message queue by calling 
>registered handlers. This is distinct from reading/writing 
>stuff off the 
>socket into the message queue.
>
>One of the reasons the low level library is low level is that 
>it can be 
>used in a lot of different ways. In a GLib or Qt app, you can just 
>assume a mainloop and hardwire "how it works"
>
>When writing your own app, there are a number of choices:
>  - if you have a main loop (a poll() or select() with 
>non-dbus stuff in
>    the fd set) then you can use the DBusWatch/DBusTimeout stuff to
>    integrate dbus fds into those you will watch
>  - if you are only dealing with dbus, read_write_dispatch() 
>can be used
>    to create a trivial dbus-only mainloop like
>    "while (read_write_dispatch()) { ; }"
>  - if you are in an environment such as Java which normally 
>uses threads
>    instead of select/poll, you can use a thread (probably with the
>    trivial dbus-only mainloop inside)
>
>If you use DBusWatch/DBusTimeout to integrate dbus into your own main 
>loop, when you dbus_watch_handle() it only reads messages into the 
>message queue. The dispatch-related functions are used to then process 
>the queue.
>
>In general you have to be careful that your main loop logic checks the 
>dispatch status anytime you do some reading, or you could go 
>back to the 
>poll() while messages are still in the queue, resulting in not seeing 
>those messages until more messages arrive. You can also use 
>set_dispatch_status_function() rather than "polling" the 
>dispatch status.
>
>As yet another option, you can ignore all the dispatch() stuff, and 
>instead of registering handlers with DBusConnection, just 
>manually pull 
>messages off the queue with dbus_connection_pop(). This is similar to 
>how Xlib works. It is perhaps the simplest way to use dbus, but is 
>pretty unfriendly to code modularity since one piece of code will be 
>eating all the messages without letting any other code sign up 
>to see them.
>
>Maybe the key insight to reduce confusion is that the functions in 
>dbus-connection.h don't all make sense together. You sort of have to 
>decide how you'll do things; if you're using a mainloop, then 
>read_write_dispatch() makes no sense, and if you're going to 
>block, then 
>all the DBusWatch etc. stuff can be ignored.
>
>The other major point is that DBusConnection is both a socket and a 
>message queue, and to understand the methods on DBusConnection 
>you need 
>to know how they each relate to both the IO and the message queue 
>processing.
>
>When using a binding that already knows what to do (glib/qt with their 
>main loops, java with threads, etc.) then there's no need to 
>think about 
>all this, thankfully ;-)
>
>Hope that helps.
>
>Havoc
>


More information about the dbus mailing list