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