Please help with signals, some seem to get lost

Erik Slagter erik at slagter.name
Tue Jan 14 10:32:36 UTC 2025


Update!

Some experimentation led to this code which seems to work! The main 
culprit seems to be that I called dbus_connection_read_write_dispatch 
and then dbus_connection_pop_message, which apparently works for methods 
but not (always) for signals. Looks like some signal messages where 
overwritten before they could be processed.

Please comment on my current approach (code simplified for optimal 
presentation). Please also note that dbus_connection_pop_message now 
always succeeds at the first occurrence (sometimes) or the second 
occurrence (mostly), The code after the second occurrence 
[while(dbus_connection_dispatch(bus_connection) != 
DBUS_DISPATCH_COMPLETE) etc.] doesn't seem to be necessary, at least up 
until now it has never run. Apparently no "dispatch" is necessary. The 
dbus_connection_flush statement may not be necessary as well.

I now send 16 test signals in one go and all of them are received!

get_message(...)
{
	if((pending_message = dbus_connection_pop_message(connection)))
		goto done;

	dbus_connection_flush(bus_connection);

	if(!dbus_connection_read_write(connection, -1))
		throw("failed");

	if((pending_message = dbus_connection_pop_message(connection)))
		goto done;

	while(dbus_connection_dispatch(connection) != DBUS_DISPATCH_COMPLETE)
	{
		print "call dispatch";

		if((pending_message = dbus_connection_pop_message(connection)))
		{
			print << "pop succeeded @3";
			goto done;
		}

		print "repeating dispatch\n";
	}

	if(!(pending_message = dbus_connection_pop_message(connection)))
	{
		print "pop succeeded @4";
		goto done;
	}

	throw("failed"));
}


More information about the dbus mailing list