[svn-commits] rmudgett: branch group/CCSS r245190 - /team/group/CCSS/main/ccss.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Feb 5 21:33:51 CST 2010


Author: rmudgett
Date: Fri Feb  5 21:33:46 2010
New Revision: 245190

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=245190
Log:
Eliminate unexpected side effect in is_state_change_valid().

The purpose of is_state_change_valid() should be to test if it is valid to
change CCSS states.  It should not change the CCSS state as a side effect.

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=245190&r1=245189&r2=245190
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Fri Feb  5 21:33:46 2010
@@ -2302,7 +2302,7 @@
 	char debug[1];
 };
 
-static int is_state_change_valid(enum cc_state *current_state, const enum cc_state new_state, struct ast_cc_agent *agent)
+static int is_state_change_valid(enum cc_state current_state, const enum cc_state new_state, struct ast_cc_agent *agent)
 {
 	int is_valid = 0;
 	switch (new_state) {
@@ -2310,38 +2310,38 @@
 		ast_log_dynamic_level(cc_logger_level, "Asked to change to state %d? That should never happen.\n", new_state);
 		break;
 	case CC_CALLER_OFFERED:
-		if (*current_state == CC_AVAILABLE) {
+		if (current_state == CC_AVAILABLE) {
 			is_valid = 1;
 		}
 		break;
 	case CC_CALLER_REQUESTED:
-		if (*current_state == CC_CALLER_OFFERED ||
-				(*current_state == CC_AVAILABLE && ast_test_flag(agent, AST_CC_AGENT_SKIP_OFFER))) {
+		if (current_state == CC_CALLER_OFFERED ||
+				(current_state == CC_AVAILABLE && ast_test_flag(agent, AST_CC_AGENT_SKIP_OFFER))) {
 			is_valid = 1;
 		}
 		break;
 	case CC_ACTIVE:
-		if (*current_state == CC_CALLER_REQUESTED || *current_state == CC_CALLER_BUSY) {
+		if (current_state == CC_CALLER_REQUESTED || current_state == CC_CALLER_BUSY) {
 			is_valid = 1;
 		}
 		break;
 	case CC_CALLEE_READY:
-		if (*current_state == CC_ACTIVE) {
+		if (current_state == CC_ACTIVE) {
 			is_valid = 1;
 		}
 		break;
 	case CC_CALLER_BUSY:
-		if (*current_state == CC_CALLEE_READY) {
+		if (current_state == CC_CALLEE_READY) {
 			is_valid = 1;
 		}
 		break;
 	case CC_RECALLING:
-		if (*current_state == CC_CALLEE_READY) {
+		if (current_state == CC_CALLEE_READY) {
 			is_valid = 1;
 		}
 		break;
 	case CC_COMPLETE:
-		if (*current_state == CC_RECALLING) {
+		if (current_state == CC_RECALLING) {
 			is_valid = 1;
 		}
 		break;
@@ -2350,10 +2350,7 @@
 		break;
 	default:
 		ast_log_dynamic_level(cc_logger_level, "Asked to change to unknown state %d\n", new_state);
-	}
-
-	if (is_valid) {
-		*current_state = new_state;
+		break;
 	}
 
 	return is_valid;
@@ -2613,8 +2610,7 @@
 		return -1;
 	}
 
-	previous_state = core_instance->current_state;
-	if (!is_state_change_valid(&core_instance->current_state, args->state, core_instance->agent)) {
+	if (!is_state_change_valid(core_instance->current_state, args->state, core_instance->agent)) {
 		ast_log_dynamic_level(cc_logger_level, "Invalid state change requested. Cannot go from %s to %s\n",
 				cc_state_to_string(core_instance->current_state), cc_state_to_string(args->state));
 		ast_free(args);
@@ -2622,6 +2618,9 @@
 		return -1;
 	}
 
+	/* We can change to the new state now. */
+	previous_state = core_instance->current_state;
+	core_instance->current_state = args->state;
 	res = state_change_funcs[core_instance->current_state](core_instance, args, previous_state);
 
 	ast_free(args);




More information about the svn-commits mailing list