[asterisk-commits] russell: branch 1.6.0 r166319 - in /branches/1.6.0: ./ main/utils.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Dec 22 11:30:06 CST 2008


Author: russell
Date: Mon Dec 22 11:30:05 2008
New Revision: 166319

URL: http://svn.digium.com/view/asterisk?view=rev&rev=166319
Log:
Merged revisions 166317 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

................
r166317 | russell | 2008-12-22 11:29:10 -0600 (Mon, 22 Dec 2008) | 10 lines

Merged revisions 166297 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r166297 | russell | 2008-12-22 11:22:56 -0600 (Mon, 22 Dec 2008) | 2 lines

Fix up timeout handling in ast_carefulwrite().

........

................

Modified:
    branches/1.6.0/   (props changed)
    branches/1.6.0/main/utils.c

Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.0/main/utils.c
URL: http://svn.digium.com/view/asterisk/branches/1.6.0/main/utils.c?view=diff&rev=166319&r1=166318&r2=166319
==============================================================================
--- branches/1.6.0/main/utils.c (original)
+++ branches/1.6.0/main/utils.c Mon Dec 22 11:30:05 2008
@@ -957,9 +957,11 @@
 		.events = POLLOUT,
 	};
 	int res;
+	struct timeval start = ast_tvnow();
+	int elapsed = 0;
 
 	/* poll() until the fd is writable without blocking */
-	while ((res = poll(&pfd, 1, timeoutms)) <= 0) {
+	while ((res = poll(&pfd, 1, timeoutms - elapsed)) <= 0) {
 		if (res == 0) {
 			/* timed out. */
 			ast_log(LOG_NOTICE, "Timed out trying to write\n");
@@ -968,6 +970,10 @@
 			/* poll() returned an error, check to see if it was fatal */
 
 			if (errno == EINTR || errno == EAGAIN) {
+				elapsed = ast_tvdiff_ms(ast_tvnow(), start);
+				if (elapsed >= timeoutms) {
+					return -1;
+				}
 				/* This was an acceptable error, go back into poll() */
 				continue;
 			}
@@ -975,6 +981,10 @@
 			/* Fatal error, bail. */
 			ast_log(LOG_ERROR, "poll returned error: %s\n", strerror(errno));
 
+			return -1;
+		}
+		elapsed = ast_tvdiff_ms(ast_tvnow(), start);
+		if (elapsed >= timeoutms) {
 			return -1;
 		}
 	}
@@ -990,19 +1000,15 @@
  * have a need to wait.  This way, we get better performance.
  * If the descriptor is blocking, all assumptions on the guaranteed
  * detail do not apply anymore.
- * Also note that in the current implementation, the delay is per-write,
- * so you still have no guarantees, anyways.
- * Fortunately the routine is only used in a few places (cli.c, manager.c,
- * res_agi.c) so it is reasonably easy to check how it behaves there.
- *
- * XXX We either need to fix the code, or fix the documentation.
  */
 int ast_carefulwrite(int fd, char *s, int len, int timeoutms) 
 {
+	struct timeval start = ast_tvnow();
 	int res = 0;
+	int elapsed = 0;
 
 	while (len) {
-		if (ast_wait_for_output(fd, timeoutms)) {
+		if (ast_wait_for_output(fd, timeoutms - elapsed)) {
 			return -1;
 		}
 
@@ -1023,6 +1029,14 @@
 		len -= res;
 		s += res;
 		res = 0;
+
+		elapsed = ast_tvdiff_ms(ast_tvnow(), start);
+		if (elapsed >= timeoutms) {
+			/* We've taken too long to write 
+			 * This is only an error condition if we haven't finished writing. */
+			res = len ? -1 : 0;
+			break;
+		}
 	}
 
 	return res;
@@ -1032,11 +1046,10 @@
 {
 	struct timeval start = ast_tvnow();
 	int n = 0;
+	int elapsed = 0;
 
 	while (len) {
-		int elapsed;
-
-		if (ast_wait_for_output(fd, timeoutms)) {
+		if (ast_wait_for_output(fd, timeoutms - elapsed)) {
 			/* poll returned a fatal error, so bail out immediately. */
 			return -1;
 		}
@@ -1061,7 +1074,7 @@
 		src += n;
 
 		elapsed = ast_tvdiff_ms(ast_tvnow(), start);
-		if (elapsed > timeoutms) {
+		if (elapsed >= timeoutms) {
 			/* We've taken too long to write 
 			 * This is only an error condition if we haven't finished writing. */
 			n = len ? -1 : 0;




More information about the asterisk-commits mailing list