dbus_pending_call_set_notify race
Havoc Pennington
hp at redhat.com
Thu Nov 30 09:00:40 PST 2006
Alexander Larsson wrote:
>> A workaround might be to set_notify and then immediately check if the
>> pending call is completed; if it isn't then you should get the notify.
>
> Isn't that racy too? The notify might be called twice. It should really
> be don inside dbus_pending_call_set_notify race so it can lock properly.
>
IIRC the reply is supposed to be atomically "used up" whenever something
takes it from the pending call. i.e. I think this works:
send_with_reply(&pending)
set_notify(pending)
if (!completed(pending))
/* we know that the notify will be called in the main loop thread,
* since no reply has arrived
*/
;
else
{
/* the reply may or may not have arrived at this point, so
* see if we can get it
*/
reply = get_reply(pending);
if (reply == NULL)
/* we know the main loop thread already handled the reply after
* we checked for completion
*/
else
/* we know we got the reply before the main thread and notify
* will never be invoked
*/
}
it'd be worth double-checking though that it works that way...
Of course this is pretty inconvenient. Maybe instead of the idle
handler, we could offer a function that essentially did the above - "set
notify or return reply" - but even with that convenience function it's
annoying, since your notifier will be run in the main loop thread and
your set_notify_or_get_reply is in a different thread, and it's probably
a pain to code things in two ways so you can handle the reply in either
thread.
Havoc
More information about the dbus
mailing list