[asterisk-bugs] [JIRA] (ASTERISK-20414) Timeout antipattern using ast_waitfor_nandfds
Digium Subversion (JIRA)
noreply at issues.asterisk.org
Wed Nov 7 11:05:21 CST 2012
[ https://issues.asterisk.org/jira/browse/ASTERISK-20414?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Digium Subversion closed ASTERISK-20414.
----------------------------------------
Resolution: Fixed
> Timeout antipattern using ast_waitfor_nandfds
> ---------------------------------------------
>
> Key: ASTERISK-20414
> URL: https://issues.asterisk.org/jira/browse/ASTERISK-20414
> Project: Asterisk
> Issue Type: Bug
> Security Level: None
> Components: Channels/General
> Affects Versions: 1.8.15.1
> Reporter: David M. Lee
>
> While fixing ASTERISK-20375, I noticed a fairly subtle anti-pattern using {{ast_waitfor_nandfds}}.
> {code}
> int timeout_ms = 3000;
> while (timeout_ms) {
> r = ast_waitfor_nandfds(chan, n, fds, nfds, NULL, &outfd, &timeout_ms);
> /* whatever */
> }
> {code}
> If the {{waitfor}} function takes less than one millisecond to return, then it won't adjust {{timeout_ms}}. If that happens consistently, then this loop will never exit. A better approach would be:
> {code}
> int timeout_ms = 3000;
> struct timeval start = ast_tvnow();
> while (ast_tvdiff_ms(ast_tvnow(), start) < timeout_ms) {
> int ms = timeout_ms - ast_tvdiff_ms(ast_tvnow(), start);
> if (ms < 0) {
> ms = 0;
> }
> r = ast_waitfor_nandfds(chan, n, fds, nfds, NULL, &outfd, &ms);
> /* whatever */
> }
> {code}
> I've fixed the problem in question [for {{ast_waitfordigit_full}}|https://reviewboard.asterisk.org/r/2109], but we should look for other misuses of this pattern so we can avoid further lockups.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the asterisk-bugs
mailing list