[Asterisk-Dev] Re: ast_waitfor*() question

Luigi Rizzo rizzo at icir.org
Tue Jun 21 10:58:32 MST 2005


two related questions
1) ast_waitfor_n_fd() maps EINTR into *ms = 0

                /* Simulate a timeout if we were interrupted */
                if (errno != EINTR)
                        *ms = -1;
                else
                        *ms = 0;

whereas ast_waitfor_nandfds() has the *ms = 0 part commmented out:

                if (errno != EINTR)
                        *ms = -1;
                else {
                        /* Just an interrupt */
    #if 0
                        *ms = 0;
    #endif

shouldn't they do the same thing ?

2) ast_waitfor_nandfds() sets *outfd = -99999 by default. I cannot find
   anything special about this value, the rest of the code uses -1
   to mark an invalid descriptor. Again, could we use -1 there as well
   so the two functions could be merged into one ?

thanks
luigi

On Tue, Jun 21, 2005 at 10:33:52AM -0700, Luigi Rizzo wrote:
> functions ast_waitfor_n_fd() and ast_waitfor_nandfds() have a performance
> issue that I would like to fix.
>  
> ast_waitfor_n_fd() has an O(N^2) loop to figure out the 'winner' fd 
> because ast_fdisset() itself is O(N):
>    
>     for (x=0;x<n;x++) {
>         if (fds[x] > -1) {
>             if ((res = ast_fdisset(pfds, fds[x], y, &spoint))) {
>                 ...
>             }
>         }
>     }
>  
> ast_waitfor_nandfds() is even worse - the loop is O(N^2 * AST_MAX_FDS)
>  
>     for (x=0;x<n;x++) {
>         for (y=0;y<AST_MAX_FDS;y++) {
>             if (c[x]->fds[y] > -1) {
>                 if ((res = ast_fdisset(pfds, c[x]->fds[y], max, &spoint))) {
>                     ....
>                 }
>             }
>         }
>     }
>  
>  
> Both can be reduced to O(N), trivially for ast_waitfor_n_fd() :
> 
>     for (x = 0; x < y; x++) {
>         if ((res = pfds[x].revents) != 0) {
>             winner = pfds[x].fd;
>             if (exception)
>                 *exception = (res & POLLPRI) ? -1 : 0;
>         }
>     }
> 
> 
> and only slightly harder for ast_waitfor_nandfds() by keeping track,
> while building the pfds[] array, which channel is associated to each entry.
>  
> I have only one question though - if multiple channels are ready,
> ast_waitfor_nandfds() seems to privilege the highest numbered one.
> Do I have to preserve this behaviour or it does not matter who
> the winner is ? I do not see it specified elsewhere.
>  
>         cheers
>         luigi



More information about the asterisk-dev mailing list