summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-08-22 21:37:21 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-01-02 08:47:11 +0100
commite4d263f1dbaa71d6b3a89cc388eb27b5694c816c (patch)
tree5a9a5dd26809c4792d960bc4bbb00977072c37b8
parent3b225f893ef036bf6c39389769a2c4e996a17b58 (diff)
downloadNetworkManager-e4d263f1dbaa71d6b3a89cc388eb27b5694c816c.tar.gz
libnm: make waiting objects fail when an object initialization fails
Previously, when the load of an object failed and there were other objects waiting for it, those objects would remain waiting forever. Make them fail as well. (cherry picked from commit f4a0ab757fca8c9ea7900f6259e8ca51a4b0a571)
-rw-r--r--libnm/nm-object.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/libnm/nm-object.c b/libnm/nm-object.c
index 3b41041e24..337ca69862 100644
--- a/libnm/nm-object.c
+++ b/libnm/nm-object.c
@@ -488,14 +488,29 @@ create_async_complete (GObject *object, NMObjectTypeAsyncData *async_data)
static void
create_async_inited (GObject *object, GAsyncResult *result, gpointer user_data)
{
+ NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object);
+ NMObjectPrivate *odata_priv;
NMObjectTypeAsyncData *async_data = user_data;
GError *error = NULL;
+ ObjectCreatedData *odata;
- NM_OBJECT_GET_PRIVATE (object)->inited = TRUE;
+ priv->inited = TRUE;
if (!g_async_initable_init_finish (G_ASYNC_INITABLE (object), result, &error)) {
dbgmsg ("Could not create object for %s: %s",
nm_object_get_path (NM_OBJECT (object)),
error->message);
+
+ while (priv->waiters) {
+ odata = priv->waiters->data;
+ odata_priv = NM_OBJECT_GET_PRIVATE (odata->self);
+
+ priv->waiters = g_slist_remove (priv->waiters, odata);
+ if (!odata_priv->reload_error)
+ odata_priv->reload_error = g_error_copy (error);
+ odata_priv->reload_remaining--;
+ reload_complete (odata->self, FALSE);
+ }
+
g_error_free (error);
g_clear_object (&object);
}
@@ -503,15 +518,13 @@ create_async_inited (GObject *object, GAsyncResult *result, gpointer user_data)
create_async_complete (object, async_data);
if (object) {
- NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object);
-
/* There are some object properties whose creation couldn't proceed
* because it depended on this object. */
while (priv->waiters) {
- ObjectCreatedData *odata = priv->waiters->data;
-
+ odata = priv->waiters->data;
priv->waiters = g_slist_remove (priv->waiters, odata);
object_property_maybe_complete (odata);
+
}
}
}