--- libev/ev.c 2010/10/15 22:59:59 1.349 +++ libev/ev.c 2010/10/16 00:59:56 1.350 @@ -945,13 +945,13 @@ ANFD *anfd = anfds + fd; ev_io *w; - unsigned char events = 0; + unsigned char o_events = anfd->events; + unsigned char o_reify = anfd->reify; - for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) - events |= (unsigned char)w->events; + anfd->reify = 0; #if EV_SELECT_IS_WINSOCKET - if (events) + if (o_reify & EV__IOFDSET) { unsigned long arg; anfd->handle = EV_FD_TO_WIN32_HANDLE (fd); @@ -959,16 +959,19 @@ } #endif - { - unsigned char o_events = anfd->events; - unsigned char o_reify = anfd->reify; + /*if (expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */ + { + anfd->events = 0; - anfd->reify = 0; - anfd->events = events; + for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) + anfd->events |= (unsigned char)w->events; - if (o_events != events || o_reify & EV__IOFDSET) - backend_modify (EV_A_ fd, o_events, events); - } + if (o_events !=anfd-> events) + o_reify = EV__IOFDSET; /* actually |= */ + } + + if (o_reify & EV__IOFDSET) + backend_modify (EV_A_ fd, o_events, anfd->events); } fdchangecnt = 0; @@ -2599,7 +2602,7 @@ wlist_del (&anfds[w->fd].head, (WL)w); ev_stop (EV_A_ (W)w); - fd_change (EV_A_ w->fd, 1); + fd_change (EV_A_ w->fd, EV_ANFD_REIFY); EV_FREQUENT_CHECK; }