diff -pruN tracker.orig/src/trackerd/tracker-dbus.c tracker.modif/src/trackerd/tracker-dbus.c --- tracker.orig/src/trackerd/tracker-dbus.c 2006-08-21 22:18:26.000000000 +0200 +++ tracker.modif/src/trackerd/tracker-dbus.c 2006-09-04 03:22:23.000000000 +0200 @@ -27,16 +27,26 @@ static void unregistered_func (DBusConn static DBusHandlerResult message_func (DBusConnection *conn, DBusMessage *message, gpointer data); +static DBusObjectPathVTable dbus_daemon_vtable = { + unregistered_func, + message_func, + NULL, + NULL, + NULL, + NULL +}; + static DBusObjectPathVTable tracker_vtable = { unregistered_func, message_func, - NULL, - NULL, + NULL, + NULL, NULL, NULL }; + DBusConnection * tracker_dbus_init (void) { @@ -55,7 +65,8 @@ tracker_dbus_init (void) dbus_connection_setup_with_g_main (connection, NULL); - if (!dbus_connection_register_object_path (connection, TRACKER_OBJECT, &tracker_vtable, NULL)) { + if (!dbus_connection_register_object_path (connection, DBUS_PATH_LOCAL, &dbus_daemon_vtable, NULL) || + !dbus_connection_register_object_path (connection, TRACKER_OBJECT, &tracker_vtable, NULL)) { tracker_log ("could not register D-BUS handlers"); connection = NULL; @@ -76,6 +87,9 @@ out: if (dbus_error_is_set (&error)) { dbus_error_free (&error); } + + dbus_connection_set_exit_on_disconnect (connection, FALSE); + return connection; } @@ -94,15 +108,15 @@ tracker_dbus_shutdown (DBusConnection *c static void unregistered_func (DBusConnection *conn, - gpointer data) + gpointer data) { } static DBusHandlerResult message_func (DBusConnection *conn, - DBusMessage *message, - gpointer data) + DBusMessage *message, + gpointer data) { DBusRec *rec; @@ -110,9 +124,22 @@ message_func (DBusConnection *conn, rec->connection = conn; rec->message = message; - if (!tracker->is_running) return; + if (!tracker->is_running) { + dbus_message_ref (message); + rec->action = DBUS_ACTION_NONE; + return DBUS_HANDLER_RESULT_HANDLED; + } + + + /* DBus connection has been lost! */ + if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) { + dbus_message_ref (message); + rec->action = DBUS_ACTION_DBUS_DISCONNECTED; + + } + - if (dbus_message_is_method_call (message, TRACKER_INTERFACE, TRACKER_METHOD_PING)) { + else if (dbus_message_is_method_call (message, TRACKER_INTERFACE, TRACKER_METHOD_PING)) { /* ref the message here because we are going to reply to it in a different thread */ dbus_message_ref (message); rec->action = DBUS_ACTION_PING; @@ -385,6 +412,3 @@ message_func (DBusConnection *conn, return DBUS_HANDLER_RESULT_HANDLED; } - - - diff -pruN tracker.orig/src/trackerd/tracker-dbus.h tracker.modif/src/trackerd/tracker-dbus.h --- tracker.orig/src/trackerd/tracker-dbus.h 2006-08-04 01:53:48.000000000 +0200 +++ tracker.modif/src/trackerd/tracker-dbus.h 2006-09-04 03:22:23.000000000 +0200 @@ -26,6 +26,7 @@ #include #include + #define TRACKER_SERVICE "org.freedesktop.Tracker" #define TRACKER_OBJECT "/org/freedesktop/tracker" #define TRACKER_INTERFACE "org.freedesktop.Tracker" @@ -97,6 +98,9 @@ #define TRACKER_SIGNAL_FILE_THUMBNAIL_CHANGED "ThumbnailChanged" typedef enum { + DBUS_ACTION_DBUS_DISCONNECTED, + + DBUS_ACTION_NONE, DBUS_ACTION_PING, diff -pruN tracker.orig/src/trackerd/trackerd.c tracker.modif/src/trackerd/trackerd.c --- tracker.orig/src/trackerd/trackerd.c 2006-09-02 20:28:39.000000000 +0200 +++ tracker.modif/src/trackerd/trackerd.c 2006-09-04 03:22:03.000000000 +0200 @@ -145,7 +145,7 @@ do_cleanup (const char *sig_msg) { if (tracker->log_file) { - tracker_log ("Received signal %s so now shutting down", sig_msg); + tracker_log ("Received signal '%s' so now shutting down", sig_msg); } tracker_print_object_allocations (); @@ -1384,7 +1384,7 @@ process_user_request_queue_thread () tracker_log ("request thread going to deep sleep..."); - g_cond_wait (tracker->request_thread_signal , tracker->request_signal_mutex); + g_cond_wait (tracker->request_thread_signal, tracker->request_signal_mutex); /* determine if wake up call is new stuff or a shutdown signal */ if (!shutdown) { @@ -1400,10 +1400,24 @@ process_user_request_queue_thread () rec = g_async_queue_try_pop (tracker->user_request_queue); - if (!rec) { + if (!rec || (rec && rec->action == DBUS_ACTION_DBUS_DISCONNECTED)) { + + if (rec && rec->action == DBUS_ACTION_DBUS_DISCONNECTED) { + tracker_log ("DBus connection has been lost, trackerd will shutdown"); + + tracker->is_running = FALSE; + tracker_end_watching (); + + g_timeout_add_full (G_PRIORITY_LOW, + 5, + (GSourceFunc) do_cleanup, + g_strdup ("DBus connection lost"), NULL + ); + + } //tracker_log ("request thread sleeping"); - g_cond_wait (tracker->request_thread_signal , tracker->request_signal_mutex); + g_cond_wait (tracker->request_thread_signal, tracker->request_signal_mutex); g_mutex_unlock (tracker->request_check_mutex); //tracker_log ("request thread awoken");