[asterisk-commits] mmichelson: branch group/CCSS r228014 - /team/group/CCSS/main/ccss.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Nov 5 10:59:49 CST 2009


Author: mmichelson
Date: Thu Nov  5 10:59:45 2009
New Revision: 228014

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=228014
Log:
Fix a logic error in cc_extension_monitor_request_cc.

The old logic would see if the list of child monitors was
empty in order to determine the return value. This is not
correct, though, since an extension monitor may be involved
in multiple calls. Instead, we need to return failure if
all of the child monitors on whom we called the request_cc
callback failed.


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=228014&r1=228013&r2=228014
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Thu Nov  5 10:59:45 2009
@@ -834,6 +834,7 @@
 static int cc_extension_monitor_request_cc(struct ast_cc_monitor *monitor, const int core_id, struct ast_cc_monitor_link *parent_link)
 {
 	struct ast_cc_monitor_link *link_iter;
+	int all_children_failed = 1;
 	AST_LIST_TRAVERSE(&monitor->child_links, link_iter, next_child) {
 		if (link_iter->core_id != core_id) {
 			continue;
@@ -842,14 +843,17 @@
 		ast_assert(link_iter->child->callbacks != NULL);
 		if (link_iter->child->callbacks->request_cc(link_iter->child, core_id, link_iter)) {
 			prune_links(link_iter->child, core_id, link_iter);
-		} else if (link_iter->child->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
-			manager_event(EVENT_FLAG_CC, "CCRequestSent",
-				"CoreID: %d\r\n"
-				"Callee: %s\r\n",
-				link_iter->core_id, link_iter->child->interface->name);
+		} else {
+			all_children_failed = 0;
+			if (link_iter->child->interface->monitor_class == AST_CC_DEVICE_MONITOR) {
+				manager_event(EVENT_FLAG_CC, "CCRequestSent",
+					"CoreID: %d\r\n"
+					"Callee: %s\r\n",
+					link_iter->core_id, link_iter->child->interface->name);
+			}
 		}
 	}
-	if (AST_LIST_EMPTY(&monitor->child_links)) {
+	if (all_children_failed) {
 		/* None of the child monitors successfully requested
 		 * CC, and so all of the child links were pruned. If this
 		 * is an extension monitor, just return -1. If this is the




More information about the asterisk-commits mailing list