[Asterisk-Dev] question about looping of code.

Steven Critchfield critch at basesys.com
Mon Nov 10 23:08:44 MST 2003


On Mon, 2003-11-10 at 10:13, Martin Pycko wrote:
> That might be something ... however most function call this funtion
> wihthout nfds (file descriptors) .... So that propably won't be visible in
> the preformance.
> 
> Did you try running asterisk like that ?

Nope, I wanted at least 1 more set of eyes to verify what I was
thinking, and maybe verify that it was worth messing with. If you think
there is any benefit, I'll write up the patch and test it, then submit
it.


> On Sun, 9 Nov 2003, Steven Critchfield wrote:
> 
> > I know, clumsy subject line.
> >
> > While tracking down a problem the other day, I noticed something that
> > seems unnecessary. (BTW, the problem was in a private patch of mine.)
> >
> > In channel.c *ast_waitfor_nandfds near the end, there ire 2 loops. It
> > seems that if the first loop is successful and assigns something to
> > winner, then nothing would happen in the second loop do to the if
> > statement. For that matter, it would seem that we continue looping
> > through the first loop even if we won't do anything after winner is
> > found. Would it be okay to move the time calculation to before the first
> > loop and just return instead of bothering to assign to winner? If you do
> > this, you can remove the winner completely from the function and just
> > place a return anywhere the assignment is and a null at the end of the
> > function.
> >
> > I'll copy the code section below for easy viewing.
> >
> >         for (x=0;x<n;x++) {
> >                 c[x]->blocking = 0;
> >                 for (y=0;y<AST_MAX_FDS;y++) {
> >                         if (c[x]->fds[y] > -1) {
> >                                 if ((FD_ISSET(c[x]->fds[y], &rfds) || FD_ISSET(c[x]->fds[y], &efds)) && !winner) {
> >                                         /* Set exception flag if appropriate */
> >                                         if (FD_ISSET(c[x]->fds[y], &efds))
> >                                                 c[x]->exception = 1;
> >                                         c[x]->fdno = y;
> >                                         winner = c[x];
> >                                 }
> >                         }
> >                 }
> >         }
> >         for (x=0;x<nfds;x++) {
> >                 if ((FD_ISSET(fds[x], &rfds) || FD_ISSET(fds[x], &efds)) && !winner) {
> >                         if (outfd)
> >                                 *outfd = fds[x];
> >                         if (FD_ISSET(fds[x], &efds) && exception)
> >                                 *exception = 1;
> >                         winner = NULL;
> >                 }
> >         }
> >         *ms = tv.tv_sec * 1000 + tv.tv_usec / 1000;
> >         return winner;
> > }
> >
> > --
> > Steven Critchfield <critch at basesys.com>
> >
> > _______________________________________________
> > Asterisk-Dev mailing list
> > Asterisk-Dev at lists.digium.com
> > http://lists.digium.com/mailman/listinfo/asterisk-dev
> >
> 
> _______________________________________________
> Asterisk-Dev mailing list
> Asterisk-Dev at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-dev
-- 
Steven Critchfield <critch at basesys.com>




More information about the asterisk-dev mailing list