summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-03-14 10:42:36 +0100
committerThomas Haller <thaller@redhat.com>2017-03-14 17:44:56 +0100
commit60b9b4736efbbe3ea43ef0da4cbe295a02348d2e (patch)
treeea34711deab758d89ea25b18c056e0cff4e4ba5e
parent117df4d425b9fa05725b3613142368d76be1027d (diff)
downloadNetworkManager-60b9b4736efbbe3ea43ef0da4cbe295a02348d2e.tar.gz
manager: delay startup-complete and devices-inited until idle
As long as there are events in the mainloop that are ready for dispatch, it's clear that startup-complete is not yet reached. https://bugzilla.gnome.org/show_bug.cgi?id=779920
-rw-r--r--src/main.c2
-rw-r--r--src/nm-manager.c41
2 files changed, 35 insertions, 8 deletions
diff --git a/src/main.c b/src/main.c
index 157bec2093..23c05f2952 100644
--- a/src/main.c
+++ b/src/main.c
@@ -402,6 +402,8 @@ main (int argc, char *argv[])
goto done;
}
+ nm_platform_process_events (NM_PLATFORM_GET);
+
/* Make sure the loopback interface is up. If interface is down, we bring
* it up and kernel will assign it link-local IPv4 and IPv6 addresses. If
* it was already up, we assume is in clean state.
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 07237f50f1..39c3309fc1 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -129,9 +129,6 @@ typedef struct {
char *hostname;
RadioState radio_states[RFKILL_TYPE_MAX];
- gboolean sleeping;
- gboolean net_enabled;
-
NMVpnManager *vpn_manager;
NMSleepMonitor *sleep_monitor;
@@ -147,8 +144,14 @@ typedef struct {
guint timestamp_update_id;
- gboolean startup;
- gboolean devices_inited;
+ guint devices_inited_id;
+
+ bool startup:1;
+ bool devices_inited:1;
+ bool devices_inited_ready:1;
+
+ bool sleeping:1;
+ bool net_enabled:1;
} NMManagerPrivate;
struct _NMManager {
@@ -4804,6 +4807,25 @@ nm_manager_write_device_state (NMManager *self)
seen_ifindexes);
}
+static gboolean
+devices_inited_cb (gpointer user_data)
+{
+ NMManager *self = user_data;
+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+
+ if (!priv->devices_inited_ready) {
+ /* lets go through another idle invocation to give the system
+ * more time to settle. */
+ priv->devices_inited_ready = TRUE;
+ return G_SOURCE_CONTINUE;
+ }
+
+ priv->devices_inited_id = 0;
+ priv->devices_inited = TRUE;
+ check_if_startup_complete (self);
+ return G_SOURCE_REMOVE;
+}
+
gboolean
nm_manager_start (NMManager *self, GError **error)
{
@@ -4866,9 +4888,8 @@ nm_manager_start (NMManager *self, GError **error)
for (i = 0; connections[i]; i++)
connection_changed (self, NM_CONNECTION (connections[i]));
- priv->devices_inited = TRUE;
-
- check_if_startup_complete (self);
+ nm_clear_g_source (&priv->devices_inited_id);
+ priv->devices_inited_id = g_idle_add_full (G_PRIORITY_LOW + 10, devices_inited_cb, self, NULL);
return TRUE;
}
@@ -4883,6 +4904,8 @@ nm_manager_stop (NMManager *self)
remove_device (self, NM_DEVICE (priv->devices->data), TRUE, TRUE);
_active_connection_cleanup (self);
+
+ nm_clear_g_source (&priv->devices_inited_id);
}
static gboolean
@@ -6041,6 +6064,8 @@ dispose (GObject *object)
g_slist_free_full (priv->auth_chains, (GDestroyNotify) nm_auth_chain_unref);
priv->auth_chains = NULL;
+ nm_clear_g_source (&priv->devices_inited_id);
+
if (priv->checkpoint_mgr) {
nm_checkpoint_manager_destroy_all (priv->checkpoint_mgr, NULL);
g_clear_pointer (&priv->checkpoint_mgr, nm_checkpoint_manager_unref);