/* select contributed by Vincent R. Slyngstad ([email protected]) */ int win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const struct timeval* timeout) { int r; #ifdef USE_SOCKETS_AS_HANDLES int i, fd, save_errno = errno; FD_SET nrd, nwr, nex; /* winsock seems incapable of dealing with all three null fd_sets, * so do the (millisecond) sleep as a special case */ if (!(rd || wr || ex)) { if (timeout) Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); /* do the best we can */ else Sleep(UINT_MAX); return 0; } StartSockets(); FD_ZERO(&nrd); FD_ZERO(&nwr); FD_ZERO(&nex); for (i = 0; i < nfds; i++) { fd = TO_SOCKET(i); if (rd && PERL_FD_ISSET(i,rd)) FD_SET((unsigned)fd, &nrd); if (wr && PERL_FD_ISSET(i,wr)) FD_SET((unsigned)fd, &nwr); if (ex && PERL_FD_ISSET(i,ex)) FD_SET((unsigned)fd, &nex); } errno = save_errno; SOCKET_TEST_ERROR(r = select(nfds, &nrd, &nwr, &nex, timeout)); save_errno = errno; for (i = 0; i < nfds; i++) { fd = TO_SOCKET(i); if (rd && PERL_FD_ISSET(i,rd) && !FD_ISSET(fd, &nrd)) PERL_FD_CLR(i,rd); if (wr && PERL_FD_ISSET(i,wr) && !FD_ISSET(fd, &nwr)) PERL_FD_CLR(i,wr); if (ex && PERL_FD_ISSET(i,ex) && !FD_ISSET(fd, &nex)) PERL_FD_CLR(i,ex); } errno = save_errno; #else SOCKET_TEST_ERROR(r = select(nfds, rd, wr, ex, timeout)); #endif return r; }
/* select contributed by Vincent R. Slyngstad ([email protected]) */ int win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const struct timeval* timeout) { int r; #ifdef USE_SOCKETS_AS_HANDLES Perl_fd_set dummy; int i, fd, bit, offset; FD_SET nrd, nwr, nex, *prd, *pwr, *pex; /* winsock seems incapable of dealing with all three null fd_sets, * so do the (millisecond) sleep as a special case */ if (!(rd || wr || ex)) { if (timeout) Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); /* do the best we can */ else Sleep(UINT_MAX); return 0; } StartSockets(); PERL_FD_ZERO(&dummy); if (!rd) rd = &dummy, prd = NULL; else prd = &nrd; if (!wr) wr = &dummy, pwr = NULL; else pwr = &nwr; if (!ex) ex = &dummy, pex = NULL; else pex = &nex; FD_ZERO(&nrd); FD_ZERO(&nwr); FD_ZERO(&nex); for (i = 0; i < nfds; i++) { fd = TO_SOCKET(i); if (PERL_FD_ISSET(i,rd)) FD_SET(fd, &nrd); if (PERL_FD_ISSET(i,wr)) FD_SET(fd, &nwr); if (PERL_FD_ISSET(i,ex)) FD_SET(fd, &nex); } SOCKET_TEST_ERROR(r = select(nfds, prd, pwr, pex, timeout)); for (i = 0; i < nfds; i++) { fd = TO_SOCKET(i); if (PERL_FD_ISSET(i,rd) && !FD_ISSET(fd, &nrd)) PERL_FD_CLR(i,rd); if (PERL_FD_ISSET(i,wr) && !FD_ISSET(fd, &nwr)) PERL_FD_CLR(i,wr); if (PERL_FD_ISSET(i,ex) && !FD_ISSET(fd, &nex)) PERL_FD_CLR(i,ex); } #else SOCKET_TEST_ERROR(r = select(nfds, rd, wr, ex, timeout)); #endif return r; }
/* select contributed by Vincent R. Slyngstad ([email protected]) */ int win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const struct timeval* timeout) { int r; int i, fd, save_errno = errno; FD_SET nrd, nwr, nex; bool just_sleep = TRUE; StartSockets(); FD_ZERO(&nrd); FD_ZERO(&nwr); FD_ZERO(&nex); for (i = 0; i < nfds; i++) { if (rd && PERL_FD_ISSET(i,rd)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nrd); just_sleep = FALSE; } if (wr && PERL_FD_ISSET(i,wr)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nwr); just_sleep = FALSE; } if (ex && PERL_FD_ISSET(i,ex)) { fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nex); just_sleep = FALSE; } } /* winsock seems incapable of dealing with all three fd_sets being empty, * so do the (millisecond) sleep as a special case */ if (just_sleep) { if (timeout) Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); /* do the best we can */ else Sleep(UINT_MAX); return 0; } errno = save_errno; SOCKET_TEST_ERROR(r = select(nfds, &nrd, &nwr, &nex, (PTIMEVAL)timeout)); save_errno = errno; for (i = 0; i < nfds; i++) { if (rd && PERL_FD_ISSET(i,rd)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nrd)) PERL_FD_CLR(i,rd); } if (wr && PERL_FD_ISSET(i,wr)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nwr)) PERL_FD_CLR(i,wr); } if (ex && PERL_FD_ISSET(i,ex)) { fd = TO_SOCKET(i); if (!FD_ISSET(fd, &nex)) PERL_FD_CLR(i,ex); } } errno = save_errno; return r; }