DBus and GMainContexts

Samuel Cormier-Iijima sciyoshi at gmail.com
Thu Sep 14 15:00:40 PDT 2006


Hi everybody,

This is my first post to the list :-) Sorry if this is the wrong
place, is there another list for the GLib bindings specifically?
Anyways, I was having some problems using GMainContexts with DBus...
I've attached code that I *think* should work. Both timeouts get
called, but whenever I try calling a function from e.g. a Python
client, the client hangs (the server just keeps chugging out
timeouts). tracker_dbus_new creates an exported DBus object that works
when used with a single thread... Thanks for any help :-)

#include <glib.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-bindings.h>

#include "tracker-dbus.h"

gboolean
timeout (gpointer data)
{
	g_print ("timeout called from context %d\n", GPOINTER_TO_INT (data));
	return TRUE;
}

gpointer
thread (gpointer data)
{
	DBusGConnection *connection;
	DBusGProxy *proxy;
	GMainContext *context;
	GMainLoop *loop;
	GSource *source;
	TrackerDBus *server;
	guint flags;

	context = g_main_context_new ();

	connection = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
	dbus_connection_setup_with_g_main (dbus_g_connection_get_connection
(connection), context);

	proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
	org_freedesktop_DBus_request_name (proxy, "testing.Tracker",
DBUS_NAME_FLAG_REPLACE_EXISTING, &flags, NULL);

	server = tracker_dbus_new ();
	dbus_g_connection_register_g_object (connection, "/testing/Tracker",
G_OBJECT (server));

	source = g_timeout_source_new (1000);
	g_source_set_callback (source, timeout, GINT_TO_POINTER (2), NULL);
	g_source_attach (source, context);

	loop = g_main_loop_new (context, FALSE);
	g_main_loop_run (loop);
}

int
main (int argc, char *argv[])
{
	GMainLoop *loop;

	g_type_init ();
	g_thread_init (NULL);
	dbus_g_thread_init ();

	g_thread_create (thread, NULL, TRUE, NULL);

	loop = g_main_loop_new (NULL, FALSE);
	g_timeout_add (1000, timeout, GINT_TO_POINTER (1));
	g_main_loop_run (loop);
}


More information about the dbus mailing list