From 21bf283256cb111996f606aec11e6521cc89ce3f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 10 May 2011 14:19:57 -0400 Subject: [PATCH 1/4] daemon: stall ListCachedUsers until ck-history finishes This way we don't normally return an empty list in early calls for systems that have network login enabled. --- src/daemon.c | 33 +++++++++++++++++++++++++++++++-- 1 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/daemon.c b/src/daemon.c index a463c46..2a18924 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -88,6 +88,7 @@ enum { enum { USER_ADDED, USER_REMOVED, + CK_HISTORY_LOADED, LAST_SIGNAL }; @@ -204,6 +205,16 @@ daemon_class_init (DaemonClass *klass) 1, DBUS_TYPE_G_OBJECT_PATH); + signals[CK_HISTORY_LOADED] = g_signal_new ("ck-history-loaded", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + dbus_g_object_type_install_info (TYPE_DAEMON, &dbus_glib_daemon_object_info); @@ -393,6 +404,7 @@ ck_history_watch (GIOChannel *source, if (done) { daemon->priv->ck_history_id = 0; + g_signal_emit (daemon, signals[CK_HISTORY_LOADED], 0); return FALSE; } @@ -1045,6 +1057,18 @@ finish_list_cached_users (gpointer user_data) return FALSE; } +static void +on_ck_history_loaded (Daemon *daemon, + ListUserData *data) +{ + /* ck-history loaded, so finish pending ListCachedUsers call */ + g_idle_add (finish_list_cached_users, data); + + g_signal_handlers_disconnect_by_func (daemon, + on_ck_history_loaded, + data); +} + gboolean daemon_list_cached_users (Daemon *daemon, DBusGMethodInvocation *context) @@ -1053,8 +1077,13 @@ daemon_list_cached_users (Daemon *daemon, data = list_user_data_new (daemon, context); - if (daemon->priv->reload_id > 0) { - /* reload in progress, wait */ + if (daemon->priv->ck_history_id > 0) { + /* loading ck-history, wait for it */ + g_signal_connect (daemon, "ck-history-loaded", + G_CALLBACK (on_ck_history_loaded), + data); + } else if (daemon->priv->reload_id > 0) { + /* reload in progress, wait a bit */ g_idle_add (finish_list_cached_users, data); } else { -- 1.7.5 From 47a5d95908a1005e2d44728a0d7e2459965190ef Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 10 May 2011 14:21:16 -0400 Subject: [PATCH 2/4] lib: ignore user-removed signals for untracked users If we don't know about a user, we don't care if it goes away, and we shouldn't try to remove it from the book keeping. --- src/libaccountsservice/act-user-manager.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c index 379c972..cbf7fc8 100644 --- a/src/libaccountsservice/act-user-manager.c +++ b/src/libaccountsservice/act-user-manager.c @@ -878,10 +878,15 @@ on_user_removed_in_accounts_service (DBusGProxy *proxy, ActUserManager *manager = ACT_USER_MANAGER (user_data); ActUser *user; - g_debug ("ActUserManager: user removed from accounts service with object path %s", object_path); - user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path); + if (user == NULL) { + g_debug ("ActUserManager: ignoring untracked user %s", object_path); + return; + } else { + g_debug ("ActUserManager: tracked user %s removed from accounts service", object_path); + } + manager->priv->new_users = g_slist_remove (manager->priv->new_users, user); remove_user (manager, user); -- 1.7.5 From 53948a60b012b0bf5aa4d72eb973aee9964d2ca4 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 10 May 2011 14:36:02 -0400 Subject: [PATCH 3/4] lib: set is-loaded in failure path We want to make sure that we always set is-loaded when things fail, so that we don't block indefinitely. --- src/libaccountsservice/act-user-manager.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c index cbf7fc8..3764ab9 100644 --- a/src/libaccountsservice/act-user-manager.c +++ b/src/libaccountsservice/act-user-manager.c @@ -572,10 +572,9 @@ on_get_seat_id_finished (DBusGProxy *proxy, g_debug ("Failed to identify the seat of the " "current session"); } - unload_seat (manager); - g_debug ("ActUserManager: GetSeatId call failed, so trying to set loaded property"); - maybe_set_is_loaded (manager); + g_debug ("ActUserManager: GetSeatId call failed, so unloading seat"); + unload_seat (manager); return; } @@ -924,8 +923,6 @@ on_get_current_session_finished (DBusGProxy *proxy, g_debug ("Failed to identify the current session"); } unload_seat (manager); - g_debug ("ActUserManager: no current session, so trying to set loaded property"); - maybe_set_is_loaded (manager); return; } @@ -1549,6 +1546,9 @@ unload_seat (ActUserManager *manager) g_free (manager->priv->seat.session_id); manager->priv->seat.session_id = NULL; + + g_debug ("ActUserManager: seat unloaded, so trying to set loaded property"); + maybe_set_is_loaded (manager); } static void -- 1.7.5 From 1932d53d3717bb8aa97307b903fba10371baa9b6 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 10 May 2011 14:36:40 -0400 Subject: [PATCH 4/4] lib: if ListCachedUsers returns zero users continue We currently block for ListCachedUsers to finish. If after it finishes, we find out it returns 0 zero users we end up hanging indefinitely. This commit fixes that. --- src/libaccountsservice/act-user-manager.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c index 3764ab9..6b4c77e 100644 --- a/src/libaccountsservice/act-user-manager.c +++ b/src/libaccountsservice/act-user-manager.c @@ -1216,8 +1216,13 @@ on_list_cached_users_finished (DBusGProxy *proxy, * * (see on_new_user_loaded) */ - g_debug ("ActUserManager: ListCachedUsers finished, will set loaded property after list is fully loaded"); - g_ptr_array_foreach (paths, (GFunc)add_new_inhibiting_user_for_object_path, manager); + if (paths->len > 0) { + g_debug ("ActUserManager: ListCachedUsers finished, will set loaded property after list is fully loaded"); + g_ptr_array_foreach (paths, (GFunc)add_new_inhibiting_user_for_object_path, manager); + } else { + g_debug ("ActUserManager: ListCachedUsers finished with empty list, maybe setting loaded property now"); + maybe_set_is_loaded (manager); + } g_ptr_array_foreach (paths, (GFunc)g_free, NULL); g_ptr_array_free (paths, TRUE); -- 1.7.5