Is dbus_pending_call_set_notify() thread safe?

Havoc Pennington hp at redhat.com
Tue Jul 31 14:02:54 PDT 2007


Hi,

Fan Wu wrote:
> I have a question for the following code:
> 
>   dbus_connection_send_with_reply();
>   dbus_pending_call_set_notify();
> 
> My understanding is dbus_connection_send_with_reply() will not only
> add the message to the queue but actually tries to send it. If there
> is a dispatcher running in another thread and the reply  comes back
> and is handled before dbus_pending_call_set_notify() is run, my
> callback will never be called.
> If this is a valid issue I suggest the two functions above be merged
> into one so that the callback is set when the pending call is created.

I would guess few people encounter this since set_notify() is usually 
used as an alternative to threads, rather than in conjunction with 
threads. With threads you can just send_with_reply_and_block() perhaps.

That aside, I believe what should work is to set your notify, then call 
dbus_pending_call_steal_reply(). If the reply arrived before you set the 
notify, then it will be returned from steal_reply().

That is sort of inconvenient and unintuitive, I know.

Perhaps we could add a send_with_reply_notify() that takes the notify 
func/data/free_data_func and manages the pending call object for you.

However, libdbus generally avoids convenience API and I'm not sure we 
need send_with_reply_notify() for the benefit of bindings...

Havoc



More information about the dbus mailing list