[svn-commits] mmichelson: branch group/CCSS_Monitor_Restructure r243063 - /team/group/CCSS_...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Jan 25 17:45:19 CST 2010


Author: mmichelson
Date: Mon Jan 25 17:45:15 2010
New Revision: 243063

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=243063
Log:
Fix up conflicts in ccss.c.

No thanks to automerge-email for not telling me about it!


Modified:
    team/group/CCSS_Monitor_Restructure/main/ccss.c

Modified: team/group/CCSS_Monitor_Restructure/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS_Monitor_Restructure/main/ccss.c?view=diff&rev=243063&r1=243062&r2=243063
==============================================================================
--- team/group/CCSS_Monitor_Restructure/main/ccss.c (original)
+++ team/group/CCSS_Monitor_Restructure/main/ccss.c Mon Jan 25 17:45:15 2010
@@ -1303,7 +1303,7 @@
 static void dialed_cc_interfaces_destroy(void *data)
 {
 	struct dialed_cc_interfaces *cc_interfaces = data;
-	ao2_t_ref(cc_interfaces->interface_tree, -1, "Unref dial's ref to interface tree");
+	cc_unref(cc_interfaces->interface_tree, "Unref dial's ref to interface tree");
 	ast_free(cc_interfaces->current_extension_dialable_name);
 	ast_free(cc_interfaces);
 }
@@ -1331,7 +1331,7 @@
 	new_cc_interfaces->ignore = old_cc_interfaces->ignore;
 	new_cc_interfaces->dial_parent_id = old_cc_interfaces->dial_parent_id;
 	new_cc_interfaces->is_original_caller = 0;
-	ao2_t_ref(old_cc_interfaces->interface_tree, +1, "New ref due to duplication of interface tree");
+	cc_ref(old_cc_interfaces->interface_tree, "New ref due to duplication of interface tree");
 	new_cc_interfaces->core_id = old_cc_interfaces->core_id;
 	new_cc_interfaces->interface_tree = old_cc_interfaces->interface_tree;
 	return new_cc_interfaces;
@@ -1396,7 +1396,7 @@
 	}
 
 	if (!(monitor = ao2_alloc(sizeof(*monitor), cc_monitor_destroy))) {
-		ao2_t_ref(cc_interface, -1, "failed to allocate the tree item, so unref the interface");
+		cc_unref(cc_interface, "failed to allocate the tree item, so unref the interface");
 		return NULL;
 	}
 
@@ -1553,19 +1553,19 @@
 	}
 
 	if (!(cc_interface->config_params = ast_cc_config_params_init())) {
-		ao2_t_ref(cc_interface, -1, "Failed to allocate config params, unref interface");
+		cc_unref(cc_interface, "Failed to allocate config params, unref interface");
 		call_destructor_with_no_monitor(cc_data->monitor_type, cc_data->private_data);
 		return NULL;
 	}
 
 	if (!(monitor = ao2_alloc(sizeof(*monitor), cc_monitor_destroy))) {
-		ao2_t_ref(cc_interface, -1, "Failed to allocate tree item, unref interface");
+		cc_unref(cc_interface, "Failed to allocate tree item, unref interface");
 		call_destructor_with_no_monitor(cc_data->monitor_type, cc_data->private_data);
 		return NULL;
 	}
 
 	if (!(monitor->dialable_name = ast_strdup(dialable_name))) {
-		ao2_t_ref(cc_interface, -1, "Failed to copy dialable name");
+		cc_unref(cc_interface, "Failed to copy dialable name");
 		cc_unref(monitor, "Failed to copy dialable name. Unref monitor");
 		call_destructor_with_no_monitor(cc_data->monitor_type, cc_data->private_data);
 		return NULL;
@@ -2659,6 +2659,7 @@
 	struct ast_cc_interface_tree *interface_tree;
 	char device_name[AST_CHANNEL_NAME];
 	struct ast_cc_monitor *device_monitor;
+	int core_id_candidate;
 
 	ast_assert(core_id != NULL);
 
@@ -2706,6 +2707,12 @@
 
 	interface_tree = cc_ref(recall_data->interface_tree, "Bump refcount for tree while we search for specific channel");
 	ast_channel_get_device_name(chan, device_name, sizeof(device_name));
+	/* We grab the value of the recall_data->core_id so that we
+	 * can unlock the channel before we start looking through the
+	 * interface list. That way we don't have to worry about a possible
+	 * clash between the channel lock and the interface tree lock.
+	 */
+	core_id_candidate = recall_data->core_id;
 	ast_channel_unlock(chan);
 
 	/*
@@ -2717,7 +2724,7 @@
 		if (!strcmp(device_monitor->interface->name, device_name) &&
 				!strcmp(device_monitor->interface->monitor_type, monitor_type)) {
 			/* BOOM! Device is in the tree! We have a winner! */
-			*core_id = recall_data->core_id;
+			*core_id = core_id_candidate;
 			AST_DLLIST_UNLOCK(interface_tree);
 			cc_unref(interface_tree, "Found a match in recall tree.");
 			return 1;




More information about the svn-commits mailing list