diff options
author | Thomas Haller <thaller@redhat.com> | 2017-03-14 10:42:36 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-03-14 17:44:56 +0100 |
commit | 60b9b4736efbbe3ea43ef0da4cbe295a02348d2e (patch) | |
tree | ea34711deab758d89ea25b18c056e0cff4e4ba5e | |
parent | 117df4d425b9fa05725b3613142368d76be1027d (diff) | |
download | NetworkManager-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.c | 2 | ||||
-rw-r--r-- | src/nm-manager.c | 41 |
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); |