summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-06-21 17:48:59 +0200
committerThomas Haller <thaller@redhat.com>2017-06-27 15:24:10 +0200
commit74a19b4f29d63267366fd18fbd23bbd9ccd0573e (patch)
tree281d0e7d8eb9ed3262be952fe17b48c4f779c010
parentc9be66ecbb23b8a55e4a01dff024331859751df7 (diff)
downloadNetworkManager-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.c35
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);