diff options
author | Thomas Haller <thaller@redhat.com> | 2017-06-21 17:48:59 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-06-27 15:24:10 +0200 |
commit | 74a19b4f29d63267366fd18fbd23bbd9ccd0573e (patch) | |
tree | 281d0e7d8eb9ed3262be952fe17b48c4f779c010 | |
parent | c9be66ecbb23b8a55e4a01dff024331859751df7 (diff) | |
download | NetworkManager-th/libnm-1-8-fix.tar.gz |
libnm: precisly track nm-running propertyth/libnm-1-8-fix
The nm-running property is rather important. Ensure to
signal it according to whether we have priv->manager
*and* whether async initialization completed.
-rw-r--r-- | libnm/nm-client.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/libnm/nm-client.c b/libnm/nm-client.c index e3e7533c12..60c417be3e 100644 --- a/libnm/nm-client.c +++ b/libnm/nm-client.c @@ -105,6 +105,7 @@ typedef struct { GDBusObjectManager *object_manager; NMClientInitData *init_data; struct udev *udev; + bool manager_initialized; } NMClientPrivate; enum { @@ -261,9 +262,13 @@ nm_client_get_startup (NMClient *client) gboolean nm_client_get_nm_running (NMClient *client) { + NMClientPrivate *priv; + g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - return NM_CLIENT_GET_PRIVATE (client)->manager != NULL; + priv = NM_CLIENT_GET_PRIVATE (client); + + return priv->manager && priv->manager_initialized; } /** @@ -2343,6 +2348,16 @@ _init_om (NMClient *self, g_signal_connect (priv->object_manager, "notify::name-owner", G_CALLBACK (name_owner_changed), self); + + if ( !init_data_async + || init_data_async->pending_init == 0) { + if ( priv->manager + && !priv->manager_initialized) { + priv->manager_initialized = TRUE; + g_object_notify (G_OBJECT (self), NM_CLIENT_NM_RUNNING); + } + } + return TRUE; } @@ -2358,6 +2373,7 @@ static void init_async_complete (NMClientInitData *init_data) { NMClientPrivate *priv; + NMClient *client = NULL; if (init_data->pending_init > 0) return; @@ -2367,11 +2383,18 @@ init_async_complete (NMClientInitData *init_data) priv = NM_CLIENT_GET_PRIVATE (init_data->client); nm_assert (priv->init_data == init_data); priv->init_data = NULL; + if (priv->manager && !priv->manager_initialized) { + priv->manager_initialized = TRUE; + client = init_data->client; + } } g_simple_async_result_complete (init_data->result); g_object_unref (init_data->result); g_clear_object (&init_data->cancellable); g_slice_free (NMClientInitData, init_data); + + if (client) + g_object_notify (G_OBJECT (client), NM_CLIENT_NM_RUNNING); } static void @@ -2415,6 +2438,7 @@ unhook_om (NMClient *self) g_signal_handlers_disconnect_by_data (priv->manager, self); g_clear_object (&priv->manager); + priv->manager_initialized = FALSE; g_object_notify (G_OBJECT (self), NM_CLIENT_ACTIVE_CONNECTIONS); g_object_notify (G_OBJECT (self), NM_CLIENT_NM_RUNNING); } @@ -2443,12 +2467,6 @@ unhook_om (NMClient *self) g_list_free_full (objects, g_object_unref); } -static void -new_object_manager (GObject *source_object, GAsyncResult *res, gpointer user_data) -{ - g_object_notify (G_OBJECT (user_data), NM_CLIENT_NM_RUNNING); -} - static gboolean got_object_manager (gpointer user_data) { @@ -2506,8 +2524,7 @@ name_owner_changed (GObject *object, GParamSpec *pspec, gpointer user_data) if (_om_has_name_owner (object_manager)) { g_clear_object (&priv->object_manager); - prepare_object_manager (self, NULL, - new_object_manager, self); + prepare_object_manager (self, NULL, NULL, NULL); } else { g_signal_handlers_disconnect_by_func (object_manager, object_added, self); unhook_om (self); |