NetworkManager r3295 - in trunk: . src



Author: dcbw
Date: Thu Feb  7 18:41:42 2008
New Revision: 3295
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=3295&view=rev

Log:
2008-02-07  Dan Williams  <dcbw redhat com>

	* 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



Modified:
   trunk/ChangeLog
   trunk/src/NetworkManagerPolicy.c

Modified: trunk/src/NetworkManagerPolicy.c
==============================================================================
--- trunk/src/NetworkManagerPolicy.c	(original)
+++ trunk/src/NetworkManagerPolicy.c	Thu Feb  7 18:41:42 2008
@@ -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 @@
 {
 	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 @@
 {
 	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);
-
-	g_signal_connect (manager, "device-added",
-					  G_CALLBACK (device_added), policy);
-
-	g_signal_connect (manager, "device-removed",
-					  G_CALLBACK (device_removed), 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);
+
+	id = g_signal_connect (manager, "device-added",
+	                       G_CALLBACK (device_added), policy);
+	policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id);
+
+	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);
-
-	g_signal_connect (manager, "connection-updated",
-					  G_CALLBACK (connection_updated), policy);
-
-	g_signal_connect (manager, "connection-removed",
-					  G_CALLBACK (connection_removed), policy);
+	id = g_signal_connect (manager, "connection-added",
+	                       G_CALLBACK (connection_added), policy);
+	policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id);
+
+	id = g_signal_connect (manager, "connection-updated",
+	                       G_CALLBACK (connection_updated), policy);
+	policy->signal_ids = g_slist_append (policy->signal_ids, (gpointer) id);
+
+	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 @@
 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);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]