=== modified file 'src/xgselect.c' --- src/xgselect.c 2014-03-05 06:31:57 +0000 +++ src/xgselect.c 2014-04-15 07:52:04 +0000 @@ -33,16 +33,15 @@ xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timespec const *timeout, sigset_t const *sigmask) { - fd_set all_rfds, all_wfds; + fd_set all_rfds, all_wfds, all_efds; struct timespec tmo; struct timespec const *tmop = timeout; GMainContext *context; - int have_wfds = wfds != NULL; GPollFD gfds_buf[128]; GPollFD *gfds = gfds_buf; int gfds_size = sizeof gfds_buf / sizeof *gfds_buf; - int n_gfds, retval = 0, our_fds = 0, max_fds = fds_lim - 1; + int n_gfds, retval = 0, all_lim = fds_lim; int i, nfds, tmo_in_millisec; bool need_to_dispatch; USE_SAFE_ALLOCA; @@ -59,6 +58,8 @@ else FD_ZERO (&all_rfds); if (wfds) all_wfds = *wfds; else FD_ZERO (&all_wfds); + eassert (!efds); + FD_ZERO (&all_efds); n_gfds = g_main_context_query (context, G_PRIORITY_LOW, &tmo_in_millisec, gfds, gfds_size); @@ -71,19 +72,28 @@ } for (i = 0; i < n_gfds; ++i) - { - if (gfds[i].events & G_IO_IN) - { - FD_SET (gfds[i].fd, &all_rfds); - if (gfds[i].fd > max_fds) max_fds = gfds[i].fd; - } - if (gfds[i].events & G_IO_OUT) - { - FD_SET (gfds[i].fd, &all_wfds); - if (gfds[i].fd > max_fds) max_fds = gfds[i].fd; - have_wfds = 1; - } - } + if (gfds[i].events & (G_IO_IN | G_IO_OUT | G_IO_PRI)) + { + int fd = gfds[i].fd; + eassert (0 <= fd && fd < FD_SETSIZE); + for (; all_lim <= fd; all_lim++) + { + FD_CLR (all_lim, &all_rfds); + FD_CLR (all_lim, &all_wfds); + } + if (gfds[i].events & G_IO_IN) + { + eassert (! (rfds && fd < fds_lim && FD_ISSET (fd, rfds))); + FD_SET (fd, &all_rfds); + } + if (gfds[i].events & G_IO_OUT) + { + eassert (! (wfds && fd < fds_lim && FD_ISSET (fd, wfds))); + FD_SET (fd, &all_wfds); + } + if (gfds[i].events & G_IO_PRI) + FD_SET (fd, &all_efds); + } SAFE_FREE (); @@ -95,34 +105,28 @@ tmop = &tmo; } - fds_lim = max_fds + 1; - nfds = pselect (fds_lim, &all_rfds, have_wfds ? &all_wfds : NULL, - efds, tmop, sigmask); + nfds = pselect (all_lim, &all_rfds, &all_wfds, &all_efds, tmop, sigmask); if (nfds < 0) retval = nfds; - else if (nfds > 0) + else { for (i = 0; i < fds_lim; ++i) { - if (FD_ISSET (i, &all_rfds)) - { - if (rfds && FD_ISSET (i, rfds)) ++retval; - else ++our_fds; - } - else if (rfds) - FD_CLR (i, rfds); - - if (have_wfds && FD_ISSET (i, &all_wfds)) - { - if (wfds && FD_ISSET (i, wfds)) ++retval; - else ++our_fds; - } - else if (wfds) - FD_CLR (i, wfds); - - if (efds && FD_ISSET (i, efds)) - ++retval; + if (rfds && FD_ISSET (i, rfds)) + { + if (FD_ISSET (i, &all_rfds)) + retval++; + else + FD_CLR (i, rfds); + } + if (wfds && FD_ISSET (i, wfds)) + { + if (FD_ISSET (i, &all_wfds)) + retval++; + else + FD_CLR (i, wfds); + } } } @@ -142,7 +146,7 @@ } /* To not have to recalculate timeout, return like this. */ - if ((our_fds > 0 || (nfds == 0 && tmop == &tmo)) && (retval == 0)) + if (retval == 0 && (0 < nfds || tmop == &tmo)) { retval = -1; errno = EINTR;