Hi,

In getting libev running on windows, I think I may have found a bug in
the select_modify() function in ev_select.c.  Apparently windows uses
an array for its fd set, and it doesn't check to see if the fd is
already in the set when you do an FD_SET.  This causes libev to put
duplicates in the set, and only one would get cleared when FD_CLR was
used.  This caused libev to go into an endless loop because select()
kept returning EBADF, but libev couldn't find the bad fd.  I imagine
that most fd sets use bitvectors or something so this isn't a problem
(not that I know much about this stuff).  I made the following
modification to select_modify (sorry it's not in diff format...I'm
sure you can see where it goes):

        if (nev & EV_READ) {
      if (!(oev & EV_READ))
                  FD_SET (handle, (fd_set *)vec_ri);
        } else {
      FD_CLR (handle, (fd_set *)vec_ri);
        }

        if (nev & EV_WRITE) {
      if (!(oev & EV_WRITE))
                  FD_SET (handle, (fd_set *)vec_wi);
        } else {
      FD_CLR (handle, (fd_set *)vec_wi);
        }

It seems that something like this should be added to the real libev
source.  You could also, of course, use the FD_ISSET macro.  This
would probably be more foolproof, but I'm guessing it would be slower
(not that we'll get much performance out of windows using select()
anyway).

Thanks,

Matt

_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to