diff options
Diffstat (limited to 'src/nm-active-connection.c')
| -rw-r--r-- | src/nm-active-connection.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c index 17fb82e5..38aadd27 100644 --- a/src/nm-active-connection.c +++ b/src/nm-active-connection.c @@ -157,6 +157,21 @@ _settings_connection_updated (NMSettingsConnection *connection, } static void +_settings_connection_removed (NMSettingsConnection *connection, + gpointer user_data) +{ + NMActiveConnection *self = user_data; + + /* Our settings connection is about to drop off. The next active connection + * cleanup is going to tear us down (at least until we grow the capability to + * re-link; in that case we'd just clean the references to the old connection here). + * Let's remove ourselves from the bus so that we're not exposed with a dangling + * reference to the setting connection once it's gone. */ + if (nm_exported_object_is_exported (NM_EXPORTED_OBJECT (self))) + nm_exported_object_unexport (NM_EXPORTED_OBJECT (self)); +} + +static void _set_settings_connection (NMActiveConnection *self, NMSettingsConnection *connection) { NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self); @@ -165,11 +180,13 @@ _set_settings_connection (NMActiveConnection *self, NMSettingsConnection *connec return; if (priv->settings_connection) { g_signal_handlers_disconnect_by_func (priv->settings_connection, _settings_connection_updated, self); + g_signal_handlers_disconnect_by_func (priv->settings_connection, _settings_connection_removed, self); g_clear_object (&priv->settings_connection); } if (connection) { priv->settings_connection = g_object_ref (connection); g_signal_connect (connection, NM_SETTINGS_CONNECTION_UPDATED_INTERNAL, (GCallback) _settings_connection_updated, self); + g_signal_connect (connection, NM_SETTINGS_CONNECTION_REMOVED, (GCallback) _settings_connection_removed, self); } } |