[svn-commits] mmichelson: branch mmichelson/timeout_fixes r373908 - /team/mmichelson/timeou...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Sep 27 11:27:47 CDT 2012


Author: mmichelson
Date: Thu Sep 27 11:27:42 2012
New Revision: 373908

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=373908
Log:
Take care of 6 of the 7 timeout problems in res_fax.

The seventh is a little more involved, so I'm doing
it as a separate change.


Modified:
    team/mmichelson/timeout_fixes/res/res_fax.c

Modified: team/mmichelson/timeout_fixes/res/res_fax.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/timeout_fixes/res/res_fax.c?view=diff&rev=373908&r1=373907&r2=373908
==============================================================================
--- team/mmichelson/timeout_fixes/res/res_fax.c (original)
+++ team/mmichelson/timeout_fixes/res/res_fax.c Thu Sep 27 11:27:42 2012
@@ -1084,9 +1084,10 @@
 
 static int disable_t38(struct ast_channel *chan)
 {
-	int ms;
+	int timeout_ms;
 	struct ast_frame *frame = NULL;
 	struct ast_control_t38_parameters t38_parameters = { .request_response = AST_T38_REQUEST_TERMINATE, };
+	struct timeval start;
 
 	ast_debug(1, "Shutting down T.38 on %s\n", chan->name);
 	if (ast_indicate_data(chan, AST_CONTROL_T38_PARAMETERS, &t38_parameters, sizeof(t38_parameters)) != 0) {
@@ -1095,16 +1096,18 @@
 	}
 
 	/* wait up to five seconds for negotiation to complete */
-	ms = 5000;
-
-	while (ms > 0) {
-		ms = ast_waitfor(chan, ms);
-		if (ms < 0) {
+	timeout_ms = 5000;
+	start = ast_tvnow();
+	while (ast_tvdiff_ms(ast_tvnow(), start) < timeout_ms) {
+		int ms = ast_remaining_ms(start, timeout_ms);
+		int res = ast_waitfor(chan, ms);
+
+		if (res < 0) {
 			ast_debug(1, "error while disabling T.38 on channel '%s'\n", chan->name);
 			return -1;
 		}
 
-		if (ms == 0) { /* all done, nothing happened */
+		if (res == 0) { /* all done, nothing happened */
 			ast_debug(1, "channel '%s' timed-out during T.38 shutdown\n", chan->name);
 			break;
 		}
@@ -1407,9 +1410,10 @@
 
 static int receivefax_t38_init(struct ast_channel *chan, struct ast_fax_session_details *details)
 {
-	int ms;
+	int timeout_ms;
 	struct ast_frame *frame = NULL;
 	struct ast_control_t38_parameters t38_parameters;
+	struct timeval start;
 
 	t38_parameters_ast_to_fax(&details->our_t38_parameters, &our_t38_parameters);
 
@@ -1421,16 +1425,19 @@
 			return -1;
 		}
 
-		ms = 3000;
-		while (ms > 0) {
-			ms = ast_waitfor(chan, ms);
-			if (ms < 0) {
+		timeout_ms = 3000;
+		start = ast_tvnow();
+		while (ast_tvdiff_ms(ast_tvnow(), start) < timeout_ms) {
+			int ms = ast_remaining_ms(start, timeout_ms);
+			int res = ast_waitfor(chan, ms);
+
+			if (res < 0) {
 				ast_log(LOG_ERROR, "error while generating CED tone on %s\n", chan->name);
 				ast_playtones_stop(chan);
 				return -1;
 			}
 
-			if (ms == 0) { /* all done, nothing happened */
+			if (res == 0) { /* all done, nothing happened */
 				break;
 			}
 
@@ -1480,7 +1487,7 @@
 	ast_debug(1, "Negotiating T.38 for receive on %s\n", chan->name);
 
 	/* wait up to five seconds for negotiation to complete */
-	ms = 5000;
+	timeout_ms = 5000;
 
 	/* set parameters based on the session's parameters */
 	t38_parameters_fax_to_ast(&t38_parameters, &details->our_t38_parameters);
@@ -1489,14 +1496,17 @@
 		return -1;
 	}
 
-	while (ms > 0) {
-		ms = ast_waitfor(chan, ms);
-		if (ms < 0) {
+	start = ast_tvnow();
+	while (ast_tvdiff_ms(ast_tvnow(), start) < timeout_ms) {
+		int ms = ast_remaining_ms(start, timeout_ms);
+		int res = ast_waitfor(chan, ms);
+
+		if (res < 0) {
 			ast_log(LOG_WARNING, "error on '%s' while waiting for T.38 negotiation.\n", chan->name);
 			return -1;
 		}
 
-		if (ms == 0) { /* all done, nothing happened */
+		if (res == 0) { /* all done, nothing happened */
 			ast_log(LOG_WARNING, "channel '%s' timed-out during the T.38 negotiation.\n", chan->name);
 			details->caps &= ~AST_FAX_TECH_T38;
 			break;
@@ -1805,9 +1815,10 @@
 
 static int sendfax_t38_init(struct ast_channel *chan, struct ast_fax_session_details *details)
 {
-	int ms;
+	int timeout_ms;
 	struct ast_frame *frame = NULL;
 	struct ast_control_t38_parameters t38_parameters;
+	struct timeval start;
 
 	t38_parameters_ast_to_fax(&details->our_t38_parameters, &our_t38_parameters);
 
@@ -1817,7 +1828,7 @@
 	 *
 	 * 10500 is enough time for 3 CNG tones
 	 */
-	ms = 10500;
+	timeout_ms = 10500;
 
 	/* don't send any audio if we've already received a T.38 reinvite */
 	if (ast_channel_get_t38_state(chan) != T38_STATE_NEGOTIATING) {
@@ -1827,15 +1838,18 @@
 		}
 	}
 
-	while (ms > 0) {
-		ms = ast_waitfor(chan, ms);
-		if (ms < 0) {
+	start = ast_tvnow();
+	while (ast_tvdiff_ms(ast_tvnow(), start) < timeout_ms) {
+		int ms = ast_remaining_ms(start, timeout_ms);
+		int res = ast_waitfor(chan, ms);
+
+		if (res < 0) {
 			ast_log(LOG_ERROR, "error while generating CNG tone on %s\n", chan->name);
 			ast_playtones_stop(chan);
 			return -1;
 		}
 
-		if (ms == 0) { /* all done, nothing happened */
+		if (res == 0) { /* all done, nothing happened */
 			break;
 		}
 
@@ -1885,7 +1899,7 @@
 		ast_debug(1, "Negotiating T.38 for send on %s\n", chan->name);
 
 		/* wait up to five seconds for negotiation to complete */
-		ms = 5000;
+		timeout_ms = 5000;
 
 		/* set parameters based on the session's parameters */
 		t38_parameters_fax_to_ast(&t38_parameters, &details->our_t38_parameters);
@@ -1894,14 +1908,17 @@
 			return -1;
 		}
 
-		while (ms > 0) {
-			ms = ast_waitfor(chan, ms);
-			if (ms < 0) {
+		start = ast_tvnow();
+		while (ast_tvdiff_ms(ast_tvnow(), start) < timeout_ms) {
+			int ms = ast_remaining_ms(start, timeout_ms);
+			int res = ast_waitfor(chan, ms);
+
+			if (res < 0) {
 				ast_log(LOG_WARNING, "error on '%s' while waiting for T.38 negotiation.\n", chan->name);
 				return -1;
 			}
 
-			if (ms == 0) { /* all done, nothing happened */
+			if (res == 0) { /* all done, nothing happened */
 				ast_log(LOG_WARNING, "channel '%s' timed-out during the T.38 negotiation.\n", chan->name);
 				details->caps &= ~AST_FAX_TECH_T38;
 				break;
@@ -1958,16 +1975,19 @@
 				return -1;
 			}
 
-			ms = 3500;
-			while (ms > 0) {
-				ms = ast_waitfor(chan, ms);
-				if (ms < 0) {
+			timeout_ms = 3500;
+			start = ast_tvnow();
+			while (ast_tvdiff_ms(ast_tvnow(), start) < timeout_ms || timeout_ms < 0) {
+				int ms = ast_remaining_ms(start, timeout_ms);
+				int res = ast_waitfor(chan, ms);
+
+				if (res < 0) {
 					ast_log(LOG_ERROR, "error while generating second CNG tone on %s\n", chan->name);
 					ast_playtones_stop(chan);
 					return -1;
 				}
 
-				if (ms == 0) { /* all done, nothing happened */
+				if (res == 0) { /* all done, nothing happened */
 					break;
 				}
 




More information about the svn-commits mailing list