[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