On Thu, Dec 01, 2016 at 04:26:50PM +0100, Jan Wickbom wrote:
>  static int
> -fdset_fill(fd_set *rfset, fd_set *wfset, struct fdset *pfdset)
> +fdset_fill(struct pollfd *rwfds, struct fdset *pfdset)
>  {
>       struct fdentry *pfdentry;
> -     int i, maxfds = -1;
> -     int num = MAX_FDS;
> -
> -     if (pfdset == NULL)
> -             return -1;
> +     int i;
> +     int num;
>  
> -     for (i = 0; i < num; i++) {
> +     for (i = 0, num = pfdset->num; i < num; i++) {
>               pfdentry = &pfdset->fd[i];
> -             if (pfdentry->fd != -1) {
> -                     int added = 0;
> -                     if (pfdentry->rcb && rfset) {
> -                             FD_SET(pfdentry->fd, rfset);
> -                             added = 1;
> -                     }
> -                     if (pfdentry->wcb && wfset) {
> -                             FD_SET(pfdentry->fd, wfset);
> -                             added = 1;
> -                     }
> -                     if (added)
> -                             maxfds = pfdentry->fd < maxfds ?
> -                                     maxfds : pfdentry->fd;
> +
> +             if (pfdentry->fd < 0) {
> +                     /* Hole in the list. Move the last one here */
> +
> +                     *pfdentry = pfdset->fd[num - 1];
> +                     pfdset->fd[num - 1].fd = -1;
> +                     num = fdset_adjust_num(pfdset);
>               }
> +             rwfds[i].fd = pfdentry->fd;
> +             rwfds[i].events = pfdentry->rcb ? POLLIN : 0;
> +             rwfds[i].events |= pfdentry->wcb ? POLLOUT : 0;

Another thing is we don't have to re-init this rwfds array again
and again. Instead, we could 

- set it up correctly when fdset_add is invoked: set the fd and
  events.

- reset revents when it's been handled at fdset_event_dispatch().

- swap with the last one and shrink the array on fd delete

Could you make a follow up patch for that?

Thanks.

        --yliu

Reply via email to