This commit is contained in:
manojampalam 2016-03-03 21:41:23 -08:00
parent 18bd5676ce
commit 61b9e0c585

View File

@ -435,136 +435,135 @@ w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const
} }
} }
if (writefds) { if (writefds) {
for (i = 0; i < fds; i++) for (i = 0; i < fds; i++)
if (FD_ISSET(i, writefds)) { if (FD_ISSET(i, writefds)) {
CHECK_FD(i); CHECK_FD(i);
in_set_fds++; in_set_fds++;
} }
} }
//if none of input fds are set return error //if none of input fds are set return error
if (in_set_fds == 0) { if (in_set_fds == 0) {
errno = EINVAL; errno = EINVAL;
debug("ERROR: empty fd_sets"); debug("ERROR: empty fd_sets");
return -1; return -1;
} }
debug2("Total in fds:%d", in_set_fds); debug2("Total in fds:%d", in_set_fds);
//start async io on selected fds if needed and pick up any events that select needs to listen on //start async io on selected fds if needed and pick up any events that select needs to listen on
for (int i = 0; i < fds; i++) { for (int i = 0; i < fds; i++) {
if (readfds && FD_ISSET(i, readfds)) { if (readfds && FD_ISSET(i, readfds)) {
if (w32_io_on_select(fd_table.w32_ios[i], TRUE) == -1) if (w32_io_on_select(fd_table.w32_ios[i], TRUE) == -1)
return -1; return -1;
if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_LISTENING)) { if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_LISTENING)) {
events[num_events++] = fd_table.w32_ios[i]->read_overlapped.hEvent; events[num_events++] = fd_table.w32_ios[i]->read_overlapped.hEvent;
} }
} }
if (writefds && FD_ISSET(i, writefds)) { if (writefds && FD_ISSET(i, writefds)) {
if (w32_io_on_select(fd_table.w32_ios[i], FALSE) == -1) if (w32_io_on_select(fd_table.w32_ios[i], FALSE) == -1)
return -1; return -1;
if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_CONNECTING)) { if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_CONNECTING)) {
events[num_events++] = fd_table.w32_ios[i]->write_overlapped.hEvent; events[num_events++] = fd_table.w32_ios[i]->write_overlapped.hEvent;
} }
} }
} }
//excute any scheduled APCs //excute any scheduled APCs
if (0 != wait_for_any_event(NULL, 0, 0)) { if (0 != wait_for_any_event(NULL, 0, 0))
return -1; return -1;
}
//see if any io is ready //see if any io is ready
for (i = 0; i < fds; i++) { for (i = 0; i < fds; i++) {
if (readfds && FD_ISSET(i, readfds)) { if (readfds && FD_ISSET(i, readfds)) {
if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) { if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) {
FD_SET(i, &read_ready_fds); FD_SET(i, &read_ready_fds);
out_ready_fds++; out_ready_fds++;
} }
} }
if (writefds && FD_ISSET(i, writefds)) { if (writefds && FD_ISSET(i, writefds)) {
if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) { if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) {
FD_SET(i, &write_ready_fds); FD_SET(i, &write_ready_fds);
out_ready_fds++; out_ready_fds++;
} }
} }
} }
//if io on some fds is already ready, return //if io on some fds is already ready, return
if (out_ready_fds) if (out_ready_fds) {
{ if (readfds)
if (readfds) *readfds = read_ready_fds;
*readfds = read_ready_fds; if (writefds)
if (writefds) *writefds = write_ready_fds;
*writefds = write_ready_fds; debug2("IO ready:%d, no wait", out_ready_fds);
debug2("IO ready:%d, no wait", out_ready_fds); return out_ready_fds;
return out_ready_fds; }
}
do { do {
ticks_now = GetTickCount64(); ticks_now = GetTickCount64();
if (time_milliseconds < (ticks_now - ticks_start)) { if (time_milliseconds < (ticks_now - ticks_start)) {
errno = ETIMEDOUT; errno = ETIMEDOUT;
debug("select timing out"); debug("select timing out");
return -1; return -1;
} }
if (0 != wait_for_any_event(events, num_events, time_milliseconds - ((ticks_now - ticks_start) & 0xffffffff))) { if (0 != wait_for_any_event(events, num_events, time_milliseconds - ((ticks_now - ticks_start) & 0xffffffff)))
return -1; return -1;
}
//check on fd status //check on fd status
out_ready_fds = 0; out_ready_fds = 0;
for (int i = 0; i < fds; i++) { for (int i = 0; i < fds; i++) {
if (readfds && FD_ISSET(i, readfds)) { if (readfds && FD_ISSET(i, readfds)) {
in_set_fds++; in_set_fds++;
if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) { if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) {
FD_SET(i, &read_ready_fds); FD_SET(i, &read_ready_fds);
out_ready_fds++; out_ready_fds++;
} }
} }
if (writefds && FD_ISSET(i, writefds)) { if (writefds && FD_ISSET(i, writefds)) {
in_set_fds++; in_set_fds++;
if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) { if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) {
FD_SET(i, &write_ready_fds); FD_SET(i, &write_ready_fds);
out_ready_fds++; out_ready_fds++;
} }
} }
} }
if (out_ready_fds) if (out_ready_fds)
break; break;
debug2("wait ended without any IO completion, looping again"); debug2("wait ended without any IO completion, looping again");
} while (1); } while (1);
if (readfds) if (readfds)
*readfds = read_ready_fds; *readfds = read_ready_fds;
if (writefds) if (writefds)
*writefds = write_ready_fds; *writefds = write_ready_fds;
return out_ready_fds; return out_ready_fds;
} }
int w32_dup(int oldfd) { int
CHECK_FD(oldfd); w32_dup(int oldfd) {
errno = EOPNOTSUPP; CHECK_FD(oldfd);
debug("ERROR: dup is not implemented yet"); errno = EOPNOTSUPP;
return -1; debug("ERROR: dup is not implemented yet");
return -1;
} }
int w32_dup2(int oldfd, int newfd) { int
CHECK_FD(oldfd); w32_dup2(int oldfd, int newfd) {
errno = EOPNOTSUPP; CHECK_FD(oldfd);
debug("ERROR: dup2 is not implemented yet"); errno = EOPNOTSUPP;
return -1; debug("ERROR: dup2 is not implemented yet");
return -1;
} }