[Asterisk-cvs] asterisk channel.c,1.207,1.208

kpfleming at lists.digium.com kpfleming at lists.digium.com
Thu Jun 23 17:27:36 CDT 2005


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv22930

Modified Files:
	channel.c 
Log Message:
optimize ast_recvchar/ast_recvtext (bug #4591)


Index: channel.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channel.c,v
retrieving revision 1.207
retrieving revision 1.208
diff -u -d -r1.207 -r1.208
--- channel.c	21 Jun 2005 23:10:29 -0000	1.207
+++ channel.c	23 Jun 2005 21:28:09 -0000	1.208
@@ -1625,65 +1625,40 @@
 
 int ast_recvchar(struct ast_channel *chan, int timeout)
 {
-	int res,ourto,c;
-	struct ast_frame *f;
-	
-	ourto = timeout;
-	for(;;)
-	   {
-		if (ast_check_hangup(chan)) return -1;
-		res = ast_waitfor(chan,ourto);
-		if (res <= 0) /* if timeout */
-		   {
-			return 0;
-		   }
-		ourto = res;
-		f = ast_read(chan);
-		if (f == NULL) return -1; /* if hangup */
-		if ((f->frametype == AST_FRAME_CONTROL) &&
-		    (f->subclass == AST_CONTROL_HANGUP)) return -1; /* if hangup */
-		if (f->frametype == AST_FRAME_TEXT)  /* if a text frame */
-		   {
-			c = *((char *)f->data);  /* get the data */
-			ast_frfree(f);
-			return(c);
-		   }
-		ast_frfree(f);
-	}
+	int c;
+	char *buf = ast_recvtext(chan, timeout);
+	if (buf == NULL)
+		return -1;	/* error or timeout */
+	c = *(unsigned char *)buf;
+	free(buf);
+	return c;
 }
 
 char *ast_recvtext(struct ast_channel *chan, int timeout)
 {
-	int res,ourto;
-	struct ast_frame *f;
-	char *buf;
+	int res, done = 0;
+	char *buf = NULL;
 	
-	ourto = timeout;
-	for(;;) {
-		if (ast_check_hangup(chan)) return NULL;
-		res = ast_waitfor(chan,ourto);
-		if (res <= 0) { 
-			/* if timeout */
-			return NULL;
-		}
-		ourto = res;
+	while (!done) {
+		struct ast_frame *f;
+		if (ast_check_hangup(chan))
+			break;
+		res = ast_waitfor(chan, timeout);
+		if (res <= 0) /* timeout or error */
+			break;
+		timeout = res;	/* update timeout */
 		f = ast_read(chan);
-		if (f == NULL) return NULL; /* no frame */
-		if ((f->frametype == AST_FRAME_CONTROL) && 
-			(f->subclass == AST_CONTROL_HANGUP)) return NULL; /* if hangup */
-		if (f->frametype == AST_FRAME_TEXT) {
-			/* if a text frame */
-			buf = (char *)malloc(strlen((char *)f->data));
-			if (buf) {
-				strcpy(buf, (char *)f->data);
-				ast_frfree(f);
-				return(buf);
-		   	} else {
-				return NULL;
-			}
+		if (f == NULL)
+			break; /* no frame */
+		if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
+			done = 1;	/* force a break */
+		else if (f->frametype == AST_FRAME_TEXT) {	/* what we want */
+			buf = strdup((char *)f->data);	/* dup and break */
+			done = 1;
 		}
 		ast_frfree(f);
 	}
+	return buf;
 }
 
 int ast_sendtext(struct ast_channel *chan, char *text)




More information about the svn-commits mailing list