Raw libdbus dispatching

Thiago Macieira thiago at kde.org
Tue Oct 24 14:31:04 PDT 2006


Peter Clifton wrote:
>The glib bindings use a custom GSource to dispatch at most one message
>per mainloop iteration if there are messages pending. Lesstif doesn't
>have a comparible source mechanism. It has Idle work functions (which I
>don't want to use, as it will spin CPU time). It has a "block_hook",
>which looks useful.. it can call your callback before it blocks in the
>mainloop's poll or select function. I could also add a timeout to fire
>periodically, but that doesn't seem like a clean solution.
>
>Does dispatching a single message before the mainloop blocks ensure that
>we won't get locked up waiting for IO?
>
>Are there any other ways to alleviate the need for a dispatch call in
>the mainloop? I don't want to block in the DBus code either though!

In Qt, I have a similar problem: there is no equivalent to a raw source 
like in glib. So I have to use either timers, events or I/O.

What I use is a form of event/timer that is scheduled for immediate 
execution at the next event loop and disables itself after the first run 
(it's what we call a "single-shot timer"). It gets enabled in one of 
these three cases:

1) the connection has just been created
2) the connection has received Input I/O (the Read watch handler has been 
called)
3) dbus_connection_send_with_reply_and_block has been called and, after it 
returned, dispatch_status == DATA_REMAINS

The difference here is that this function dispatches all messages until no 
data remains. Therefore, it's necessary to have I/O for more data to be 
available, so we are sure of catching all cases. In the QtDBus binding, 
there is no other way for the connection to receive data (no other 
blocking function is ever called).

If you want to do like glib and dispatch only one message, you should 
verify at the end of the function if there's still data to be processed 
and, if so, keep the timer enabled.

-- 
  Thiago Macieira  -  thiago (AT) macieira.info - thiago (AT) kde.org
    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: not available
Url : http://lists.freedesktop.org/archives/dbus/attachments/20061024/886e7cd9/attachment.pgp


More information about the dbus mailing list