[svn-commits] mmichelson: branch group/CCSS r247740 - /team/group/CCSS/main/ccss.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Feb 18 15:08:46 CST 2010


Author: mmichelson
Date: Thu Feb 18 15:08:42 2010
New Revision: 247740

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=247740
Log:
Change from doubly-linked lists to singly-linked lists.

The change made two commits ago to allow for all devices to be added to
the CC_INTERFACES channel variable changed how list traversal is done
when making monitor callbacks. The result is that there is no longer
a good reason to be using doubly-linked lists. Therefore, they have
been removed. The backwards traversals are all forward traversals now.


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

Modified: team/group/CCSS/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=247740&r1=247739&r2=247740
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Thu Feb 18 15:08:42 2010
@@ -163,7 +163,7 @@
  * to use it, and it may last beyond the lifetime of a single
  * thread.
  */
-AST_DLLIST_HEAD(ast_cc_interface_tree, ast_cc_monitor);
+AST_LIST_HEAD(ast_cc_interface_tree, ast_cc_monitor);
 
 /*!
  * \internal
@@ -1372,13 +1372,13 @@
 {
 	struct ast_cc_interface_tree *cc_interface_tree = data;
 	struct ast_cc_monitor *monitor;
-	while ((monitor = AST_DLLIST_REMOVE_HEAD(cc_interface_tree, next))) {
+	while ((monitor = AST_LIST_REMOVE_HEAD(cc_interface_tree, next))) {
 		if (monitor->callbacks) {
 			monitor->callbacks->cancel_available_timer(monitor, &monitor->available_timer_id);
 		}
 		cc_unref(monitor, "Destroying all monitors");
 	}
-	AST_DLLIST_HEAD_DESTROY(cc_interface_tree);
+	AST_LIST_HEAD_DESTROY(cc_interface_tree);
 }
 
 /*!
@@ -1561,22 +1561,22 @@
 	id = cc_interfaces->dial_parent_id;
 	ast_channel_unlock(incoming);
 
-	AST_DLLIST_LOCK(interface_tree);
-	AST_DLLIST_TRAVERSE(interface_tree, monitor, next) {
+	AST_LIST_LOCK(interface_tree);
+	AST_LIST_TRAVERSE(interface_tree, monitor, next) {
 		if (monitor->id == id) {
 			break;
 		}
 	}
 
 	if (!monitor) {
-		AST_DLLIST_UNLOCK(interface_tree);
+		AST_LIST_UNLOCK(interface_tree);
 		cc_unref(interface_tree, "Done with interface tree");
 		return;
 	}
 
 	extension_pvt = monitor->private_data;
 	if (!(child_dialstring = ast_calloc(1, sizeof(*child_dialstring)))) {
-		AST_DLLIST_UNLOCK(interface_tree);
+		AST_LIST_UNLOCK(interface_tree);
 		cc_unref(interface_tree, "Done with interface tree");
 		return;
 	}
@@ -1584,7 +1584,7 @@
 	ast_copy_string(child_dialstring->device_name, device_name, sizeof(child_dialstring->device_name));
 	child_dialstring->is_valid = 1;
 	AST_LIST_INSERT_TAIL(&extension_pvt->child_dialstrings, child_dialstring, next);
-	AST_DLLIST_UNLOCK(interface_tree);
+	AST_LIST_UNLOCK(interface_tree);
 	cc_unref(interface_tree, "Done with interface tree");
 }
 
@@ -1594,7 +1594,7 @@
 	struct extension_monitor_pvt *extension_pvt;
 	struct extension_child_dialstring *child_dialstring;
 
-	AST_DLLIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
 		if (monitor_iter->id == parent_id) {
 			break;
 		}
@@ -1715,8 +1715,8 @@
 	}
 
 	/* Finally, all that allocation is done... */
-	AST_DLLIST_HEAD_INIT(interfaces->interface_tree);
-	AST_DLLIST_INSERT_TAIL(interfaces->interface_tree, monitor, next);
+	AST_LIST_HEAD_INIT(interfaces->interface_tree);
+	AST_LIST_INSERT_TAIL(interfaces->interface_tree, monitor, next);
 	cc_ref(monitor, "List's reference to extension monitor");
 	dial_cc_datastore->data = interfaces;
 	dial_cc_datastore->inheritance = DATASTORE_INHERIT_FOREVER;
@@ -1918,17 +1918,17 @@
 	 * This traversal helps us to not create duplicate tree items in
 	 * case a device queues multiple CC control frames.
 	 */
-	AST_DLLIST_LOCK(cc_interfaces->interface_tree);
-	AST_DLLIST_TRAVERSE(cc_interfaces->interface_tree, monitor, next) {
+	AST_LIST_LOCK(cc_interfaces->interface_tree);
+	AST_LIST_TRAVERSE(cc_interfaces->interface_tree, monitor, next) {
 		if (!strcmp(monitor->interface->device_name, device_name)) {
 			ast_log_dynamic_level(cc_logger_level, "Device %s sent us multiple CC control frames. Ignoring those beyond the first.\n", device_name);
-			AST_DLLIST_UNLOCK(cc_interfaces->interface_tree);
+			AST_LIST_UNLOCK(cc_interfaces->interface_tree);
 			cc_unref(core_instance, "Returning early from ast_handle_cc_control_frame");
 			call_destructor_with_no_monitor(cc_data->monitor_type, cc_data->private_data);
 			return;
 		}
 	}
-	AST_DLLIST_UNLOCK(cc_interfaces->interface_tree);
+	AST_LIST_UNLOCK(cc_interfaces->interface_tree);
 
 	if (!(monitor = cc_device_monitor_init(device_name, dialstring, cc_data, cc_interfaces->core_id))) {
 		ast_log(LOG_WARNING, "Unable to create CC device interface for '%s'. CC services will be unavailable on this interface.\n", device_name);
@@ -1937,10 +1937,10 @@
 		return;
 	}
 
-	AST_DLLIST_LOCK(cc_interfaces->interface_tree);
+	AST_LIST_LOCK(cc_interfaces->interface_tree);
 	cc_ref(monitor, "Interface tree's reference to the monitor");
-	AST_DLLIST_INSERT_TAIL(cc_interfaces->interface_tree, monitor, next);
-	AST_DLLIST_UNLOCK(cc_interfaces->interface_tree);
+	AST_LIST_INSERT_TAIL(cc_interfaces->interface_tree, monitor, next);
+	AST_LIST_UNLOCK(cc_interfaces->interface_tree);
 
 	cc_extension_monitor_change_is_valid(core_instance, monitor->parent_id, monitor->interface->device_name, 0);
 
@@ -2022,10 +2022,10 @@
 	 * on the datastore, so we need to copy that into this monitor.
 	 */
 	monitor->dialstring = ast_strdup(interfaces->current_extension_dialstring);
-	AST_DLLIST_LOCK(interfaces->interface_tree);
+	AST_LIST_LOCK(interfaces->interface_tree);
 	cc_ref(monitor, "Interface tree's reference to the monitor");
-	AST_DLLIST_INSERT_TAIL(interfaces->interface_tree, monitor, next);
-	AST_DLLIST_UNLOCK(interfaces->interface_tree);
+	AST_LIST_INSERT_TAIL(interfaces->interface_tree, monitor, next);
+	AST_LIST_UNLOCK(interfaces->interface_tree);
 	interfaces->dial_parent_id = monitor->id;
 	cc_unref(monitor, "Unref monitor's allocation reference");
 	return 0;
@@ -2587,7 +2587,7 @@
 	struct ast_cc_monitor *iter;
 	int res = 0;
 
-	AST_DLLIST_TRAVERSE(core_instance->monitors, iter, next) {
+	AST_LIST_TRAVERSE(core_instance->monitors, iter, next) {
 		if (iter->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
 			res = 1;
 			break;
@@ -2600,11 +2600,11 @@
 static void request_cc(struct cc_core_instance *core_instance)
 {
 	struct ast_cc_monitor *monitor_iter;
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
 		if (monitor_iter->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
 			if (monitor_iter->callbacks->request_cc(monitor_iter, &monitor_iter->available_timer_id)) {
-				AST_DLLIST_REMOVE_CURRENT(next);
+				AST_LIST_REMOVE_CURRENT(next);
 				cc_extension_monitor_change_is_valid(core_instance, monitor_iter->parent_id, 
 						monitor_iter->interface->device_name, 1);
 				cc_unref(monitor_iter, "request_cc failed. Unref list's reference to monitor");
@@ -2617,12 +2617,12 @@
 			}
 		}
 	}
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END;
+	AST_LIST_TRAVERSE_SAFE_END;
 
 	if (!has_device_monitors(core_instance)) {
 		ast_cc_failed(core_instance->core_id, "All device monitors failed to request CC");
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 }
 
 static int cc_caller_requested(struct cc_core_instance *core_instance, struct cc_state_change_args *args, enum cc_state previous_state)
@@ -2644,23 +2644,23 @@
 static void unsuspend(struct cc_core_instance *core_instance)
 {
 	struct ast_cc_monitor *monitor_iter;
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
 		if (monitor_iter->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
 			if (monitor_iter->callbacks->unsuspend(monitor_iter)) {
-				AST_DLLIST_REMOVE_CURRENT(next);
+				AST_LIST_REMOVE_CURRENT(next);
 				cc_extension_monitor_change_is_valid(core_instance, monitor_iter->parent_id, 
 						monitor_iter->interface->device_name, 1);
 				cc_unref(monitor_iter, "unsuspend failed. Unref list's reference to monitor");
 			}
 		}
 	}
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END;
+	AST_LIST_TRAVERSE_SAFE_END;
 
 	if (!has_device_monitors(core_instance)) {
 		ast_cc_failed(core_instance->core_id, "All device monitors failed to unsuspend CC");
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 }
 
 static int cc_active(struct cc_core_instance *core_instance, struct cc_state_change_args *args, enum cc_state previous_state)
@@ -2694,23 +2694,23 @@
 static void suspend(struct cc_core_instance *core_instance)
 {
 	struct ast_cc_monitor *monitor_iter;
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
 		if (monitor_iter->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
 			if (monitor_iter->callbacks->suspend(monitor_iter)) {
-				AST_DLLIST_REMOVE_CURRENT(next);
+				AST_LIST_REMOVE_CURRENT(next);
 				cc_extension_monitor_change_is_valid(core_instance, monitor_iter->parent_id, 
 						monitor_iter->interface->device_name, 1);
 				cc_unref(monitor_iter, "suspend failed. Unref list's reference to monitor");
 			}
 		}
 	}
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END;
+	AST_LIST_TRAVERSE_SAFE_END;
 
 	if (!has_device_monitors(core_instance)) {
 		ast_cc_failed(core_instance->core_id, "All device monitors failed to suspend CC");
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 }
 
 static int cc_caller_busy(struct cc_core_instance *core_instance, struct cc_state_change_args *args, enum cc_state previous_state)
@@ -2730,23 +2730,23 @@
 static void cancel_available_timer(struct cc_core_instance *core_instance)
 {
 	struct ast_cc_monitor *monitor_iter;
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
 		if (monitor_iter->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
 			if (monitor_iter->callbacks->cancel_available_timer(monitor_iter, &monitor_iter->available_timer_id)) {
-				AST_DLLIST_REMOVE_CURRENT(next);
+				AST_LIST_REMOVE_CURRENT(next);
 				cc_extension_monitor_change_is_valid(core_instance, monitor_iter->parent_id, 
 						monitor_iter->interface->device_name, 1);
 				cc_unref(monitor_iter, "cancel_available_timer failed. Unref list's reference to monitor");
 			}
 		}
 	}
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END;
+	AST_LIST_TRAVERSE_SAFE_END;
 
 	if (!has_device_monitors(core_instance)) {
 		ast_cc_failed(core_instance->core_id, "All device monitors failed to cancel their available timers");
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 }
 
 static int cc_recalling(struct cc_core_instance *core_instance, struct cc_state_change_args *args, enum cc_state previous_state)
@@ -2999,18 +2999,18 @@
 	 * Now we need to find out if the channel device name
 	 * is in the list of interfaces in the called tree.
 	 */
-	AST_DLLIST_LOCK(interface_tree);
-	AST_DLLIST_TRAVERSE(interface_tree, device_monitor, next) {
+	AST_LIST_LOCK(interface_tree);
+	AST_LIST_TRAVERSE(interface_tree, device_monitor, next) {
 		if (!strcmp(device_monitor->interface->device_name, device_name) &&
 				!strcmp(device_monitor->interface->monitor_type, monitor_type)) {
 			/* BOOM! Device is in the tree! We have a winner! */
 			*core_id = core_id_candidate;
-			AST_DLLIST_UNLOCK(interface_tree);
+			AST_LIST_UNLOCK(interface_tree);
 			cc_unref(interface_tree, "Found a match in recall tree.");
 			return 1;
 		}
 	}
-	AST_DLLIST_UNLOCK(interface_tree);
+	AST_LIST_UNLOCK(interface_tree);
 	cc_unref(interface_tree, "No match in recall tree.");
 	return 0;
 }
@@ -3024,15 +3024,15 @@
 		return NULL;
 	}
 
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
 		if (!strcmp(monitor_iter->interface->device_name, device_name)) {
 			/* Found a monitor. */
 			cc_ref(monitor_iter, "Hand the requester of the monitor a reference");
 			break;
 		}
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 	cc_unref(core_instance, "Done with core instance ref in ast_cc_get_monitor_by_recall_core_id");
 	return monitor_iter;
 }
@@ -3070,7 +3070,7 @@
 	}
 
 	/* And now we get the dialstrings from each of the device monitors */
-	while ((monitor_iter = AST_DLLIST_NEXT(monitor_iter, next))) {
+	while ((monitor_iter = AST_LIST_NEXT(monitor_iter, next))) {
 		if (monitor_iter->parent_id == top_level_id) {
 			cc_unique_append(var_value, monitor_iter->dialstring);
 		}
@@ -3102,10 +3102,10 @@
 	interface_tree = cc_ref(recall_data->interface_tree, "Getting ref of recall interface tree");
 	ast_channel_unlock(chan);
 
-	AST_DLLIST_LOCK(interface_tree);
-	monitor = AST_DLLIST_FIRST(interface_tree);
+	AST_LIST_LOCK(interface_tree);
+	monitor = AST_LIST_FIRST(interface_tree);
 	set_cc_interfaces_chanvar(monitor, chan);
-	AST_DLLIST_UNLOCK(interface_tree);
+	AST_LIST_UNLOCK(interface_tree);
 
 	cc_unref(interface_tree, "Done with interface tree while setting CC_INTERFACES");
 	return 0;
@@ -3127,8 +3127,8 @@
 	interface_tree = cc_ref(recall_data->interface_tree, "Get reference to recall data interface tree");
 	ast_channel_unlock(chan);
 
-	AST_DLLIST_LOCK(interface_tree);
-	AST_DLLIST_TRAVERSE(interface_tree, monitor_iter, next) {
+	AST_LIST_LOCK(interface_tree);
+	AST_LIST_TRAVERSE(interface_tree, monitor_iter, next) {
 		if (!strcmp(monitor_iter->interface->device_name, extension)) {
 			break;
 		}
@@ -3139,13 +3139,13 @@
 		 * we have been directed into an unexpected extension because
 		 * the admin has changed a CC_INTERFACES variable at some point.
 		 */
-		AST_DLLIST_UNLOCK(interface_tree);
+		AST_LIST_UNLOCK(interface_tree);
 		cc_unref(interface_tree, "Couldn't find the extension specified");
 		return -1;
 	}
 
 	set_cc_interfaces_chanvar(monitor_iter, chan);
-	AST_DLLIST_UNLOCK(interface_tree);
+	AST_LIST_UNLOCK(interface_tree);
 	cc_unref(interface_tree, "Done writing the CC_INTERFACES channel variable");
 	return 0;
 }
@@ -3344,11 +3344,11 @@
 		return -1;
 	}
 
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE_SAFE_BEGIN(core_instance->monitors, monitor_iter, next) {
 		if (monitor_iter->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
 			if (!strcmp(monitor_iter->interface->device_name, failure_data->device_name)) {
-				AST_DLLIST_REMOVE_CURRENT(next);
+				AST_LIST_REMOVE_CURRENT(next);
 				cc_extension_monitor_change_is_valid(core_instance, monitor_iter->parent_id, 
 						monitor_iter->interface->device_name, 1);
 				monitor_iter->callbacks->cancel_available_timer(monitor_iter, &monitor_iter->available_timer_id);
@@ -3356,12 +3356,12 @@
 			}
 		}
 	}
-	AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END;
+	AST_LIST_TRAVERSE_SAFE_END;
 
 	if (!has_device_monitors(core_instance)) {
 		ast_cc_failed(core_instance->core_id, "All monitors have failed\n");
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 	cc_unref(core_instance, "Finished with core_instance in cc_monitor_failed\n");
 
 	ast_free((char *) failure_data->device_name);
@@ -3506,14 +3506,14 @@
 
 	ast_free(args);
 
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
 		if (monitor_iter->interface->monitor_class == AST_CC_DEVICE_MONITOR &&
 				monitor_iter->callbacks->status_response) {
 			monitor_iter->callbacks->status_response(monitor_iter, devstate);
 		}
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 	cc_unref(core_instance, "Status response finished. Unref core instance");
 	return 0;
 }
@@ -3759,15 +3759,15 @@
 	const char *monitor_type = cb_data->monitor_type;
 	struct ast_cc_monitor *monitor_iter;
 
-	AST_DLLIST_LOCK(core_instance->monitors);
-	AST_DLLIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
+	AST_LIST_LOCK(core_instance->monitors);
+	AST_LIST_TRAVERSE(core_instance->monitors, monitor_iter, next) {
 		if (!strcmp(monitor_iter->interface->device_name, device_name) && 
 				!strcmp(monitor_iter->interface->monitor_type, monitor_type)) {
 			cb_data->count++;
 			break;
 		}
 	}
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_UNLOCK(core_instance->monitors);
 	return 0;
 }
 
@@ -3825,7 +3825,7 @@
 	}
 	ast_cli(fd, "\n");
 
-	while ((child_monitor_iter = AST_DLLIST_NEXT(child_monitor_iter, next))) {
+	while ((child_monitor_iter = AST_LIST_NEXT(child_monitor_iter, next))) {
 		if (child_monitor_iter->parent_id == monitor->id) {
 			cc_cli_print_monitor_stats(child_monitor_iter, fd, child_monitor_iter->id);
 		}
@@ -3839,9 +3839,9 @@
 
 	ast_cli(*cli_fd, "%d\t\t%s\t\t%s\n", core_instance->core_id, core_instance->agent->device_name,
 			cc_state_to_string(core_instance->current_state));
-	AST_DLLIST_LOCK(core_instance->monitors);
-	cc_cli_print_monitor_stats(AST_DLLIST_FIRST(core_instance->monitors), *cli_fd, 0);
-	AST_DLLIST_UNLOCK(core_instance->monitors);
+	AST_LIST_LOCK(core_instance->monitors);
+	cc_cli_print_monitor_stats(AST_LIST_FIRST(core_instance->monitors), *cli_fd, 0);
+	AST_LIST_UNLOCK(core_instance->monitors);
 	return 0;
 }
 




More information about the svn-commits mailing list