dbus_connection_read_write_dispatch sometimes causing 100% cpu usage

Havoc Pennington hp at pobox.com
Fri Sep 10 12:32:59 PDT 2010


Hi,

On Fri, Sep 10, 2010 at 2:56 PM, Burton Samograd <burton at userful.com> wrote:
> For the first part, I am having trouble finding how this code will ever
> exit the loop, since connection->dispatch_acquired is never set
> anywhere.  This seems like a standard infinite loop, but maybe someone
> could shed some light on how this is supposed to exit.

dispatch_acquired does get set, see
_dbus_connection_acquire_dispatch() and
_dbus_connection_release_dispatch().

> but since thread_functions.condvar_wait is 0, the code is never executed
> (since I don't call dbus_init_threads (or whatever that function is
> called) in my code since it is single threaded)...

This makes me suspect you're recursing and re-entering dispatch
(trying to _dbus_connection_acquire_dispatch() twice without releasing
it)

> Here is a stack trace from where I am in the loop:
>
> #0  _dbus_connection_acquire_dispatch (connection=0x1053c00) at dbus-connection.c:3864
> #1  0x00007f96c57726bb in dbus_connection_dispatch (connection=0x1053c00) at dbus-connection.c:4303
> #2  0x00007f96c5770654 in _dbus_connection_read_write_dispatch (connection=0x1053c00,
>    timeout_milliseconds=100, dispatch=1) at dbus-connection.c:3431
> #3  0x00007f96c5770a22 in dbus_connection_read_write_dispatch (connection=0x1053c00,
>    timeout_milliseconds=100) at dbus-connection.c:3513

It looks like you somehow have read_write_dispatch from inside
read_write_dispatch, and the inner read_write_dispatch is waiting for
the outer one to give up dispatch_acquired (i.e.
_dbus_connection_release_dispatch())

Havoc


More information about the dbus mailing list