diff --git a/ChangeLog b/ChangeLog index 37142c23a..0236f1e3e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-02-07 Dan Williams + + * src/NetworkManagerPolicy.c + - (connection_updated): clear invalid tag when connection gets updated + to allow that connection to be tried again + - (nm_policy_new): save signal ids so they can be disconnected when + the policy is destroyed + - (nm_policy_destroy): stop any in-progress state change idle handler, + and disconnect all signals from the manager object so that none + of the policy functions gets called after the policy is destroyed + 2008-02-06 Dan Williams * src/nm-manager.c diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c index 454fe7c74..1a3ceaa1e 100644 --- a/src/NetworkManagerPolicy.c +++ b/src/NetworkManagerPolicy.c @@ -44,6 +44,7 @@ struct NMPolicy { NMManager *manager; guint device_state_changed_idle_id; + GSList *signal_ids; }; #define INVALID_TAG "invalid" @@ -550,6 +551,9 @@ connection_updated (NMManager *manager, { NMPolicy *policy = (NMPolicy *) user_data; + /* Clear the invalid tag on the connection if it got updated. */ + g_object_set_data (G_OBJECT (connection), INVALID_TAG, NULL); + schedule_change_check (policy); } @@ -584,37 +588,46 @@ nm_policy_new (NMManager *manager) { NMPolicy *policy; static gboolean initialized = FALSE; + gulong id; g_return_val_if_fail (NM_IS_MANAGER (manager), NULL); g_return_val_if_fail (initialized == FALSE, NULL); - policy = g_slice_new (NMPolicy); + policy = g_malloc0 (sizeof (NMPolicy)); policy->manager = g_object_ref (manager); policy->device_state_changed_idle_id = 0; - g_signal_connect (manager, "state-change", G_CALLBACK (global_state_changed), policy); + id = g_signal_connect (manager, "state-change", + G_CALLBACK (global_state_changed), policy); + policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id); - g_signal_connect (manager, "device-added", - G_CALLBACK (device_added), policy); + id = g_signal_connect (manager, "device-added", + G_CALLBACK (device_added), policy); + policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id); - g_signal_connect (manager, "device-removed", - G_CALLBACK (device_removed), policy); + id = g_signal_connect (manager, "device-removed", + G_CALLBACK (device_removed), policy); + policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id); /* Large batch of connections added, manager doesn't want us to * process each one individually. */ - g_signal_connect (manager, "connections-added", - G_CALLBACK (connections_added), policy); + id = g_signal_connect (manager, "connections-added", + G_CALLBACK (connections_added), policy); + policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id); /* Single connection added */ - g_signal_connect (manager, "connection-added", - G_CALLBACK (connection_added), policy); + id = g_signal_connect (manager, "connection-added", + G_CALLBACK (connection_added), policy); + policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id); - g_signal_connect (manager, "connection-updated", - G_CALLBACK (connection_updated), policy); + id = g_signal_connect (manager, "connection-updated", + G_CALLBACK (connection_updated), policy); + policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id); - g_signal_connect (manager, "connection-removed", - G_CALLBACK (connection_removed), policy); + id = g_signal_connect (manager, "connection-removed", + G_CALLBACK (connection_removed), policy); + policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id); return policy; } @@ -622,9 +635,20 @@ nm_policy_new (NMManager *manager) void nm_policy_destroy (NMPolicy *policy) { - if (policy) { - g_object_unref (policy->manager); - g_slice_free (NMPolicy, policy); + GSList *iter; + + g_return_if_fail (policy != NULL); + + if (policy->device_state_changed_idle_id) { + g_source_remove (policy->device_state_changed_idle_id); + policy->device_state_changed_idle_id = 0; } + + for (iter = policy->signal_ids; iter; iter = g_slist_next (iter)) + g_signal_handler_disconnect (policy->manager, (gulong) iter->data); + g_slist_free (policy->signal_ids); + + g_object_unref (policy->manager); + g_free (policy); }