diff options
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r-- | winsup/cygwin/select.cc | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 6d1250cf4..bab2c01d3 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -100,20 +100,28 @@ cygwin_select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, select_printf ("select(%d, %p, %p, %p, %p)", maxfds, readfds, writefds, exceptfds, to); pthread_testcancel (); - - /* Convert to milliseconds or INFINITE if to == NULL */ - DWORD ms = to ? (to->tv_sec * 1000) + (to->tv_usec / 1000) : INFINITE; - if (ms == 0 && to->tv_usec) - ms = 1; /* At least 1 ms granularity */ - - if (to) - select_printf ("to->tv_sec %d, to->tv_usec %d, ms %d", to->tv_sec, to->tv_usec, ms); + int res; + if (maxfds < 0) + { + set_errno (EINVAL); + res = -1; + } else - select_printf ("to NULL, ms %x", ms); + { + /* Convert to milliseconds or INFINITE if to == NULL */ + DWORD ms = to ? (to->tv_sec * 1000) + (to->tv_usec / 1000) : INFINITE; + if (ms == 0 && to->tv_usec) + ms = 1; /* At least 1 ms granularity */ - int res = select (maxfds, readfds ?: allocfd_set (maxfds), + if (to) + select_printf ("to->tv_sec %d, to->tv_usec %d, ms %d", to->tv_sec, to->tv_usec, ms); + else + select_printf ("to NULL, ms %x", ms); + + res = select (maxfds, readfds ?: allocfd_set (maxfds), writefds ?: allocfd_set (maxfds), exceptfds ?: allocfd_set (maxfds), ms); + } syscall_printf ("%R = select(%d, %p, %p, %p, %p)", res, maxfds, readfds, writefds, exceptfds, to); return res; @@ -179,6 +187,7 @@ select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, else res = sel.wait (r, w, e, ms); /* wait for an fd to become become active or time out */ + select_printf ("res %d", res); if (res >= 0) { copyfd_set (readfds, r, maxfds); @@ -197,7 +206,10 @@ select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, select_printf ("recalculating ms"); LONGLONG now = gtod.msecs (); if (now > (start_time + ms)) - select_printf ("timed out after verification"); + { + select_printf ("timed out after verification"); + res = select_stuff::select_error; + } else { ms -= (now - start_time); @@ -228,11 +240,11 @@ pselect(int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, tv.tv_usec = ts->tv_nsec / 1000; } if (set) - set_signal_mask (*set, _my_tls.sigmask); + set_signal_mask (_my_tls.sigmask, *set); int ret = cygwin_select (maxfds, readfds, writefds, exceptfds, ts ? &tv : NULL); if (set) - set_signal_mask (oldset, _my_tls.sigmask); + set_signal_mask (_my_tls.sigmask, oldset); return ret; } @@ -320,7 +332,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, select_record *s = &start; DWORD m = 0; - w4[m++] = signal_arrived; /* Always wait for the arrival of a signal. */ + set_thread_waiting here (w4[m++]); if ((w4[m] = pthread::get_cancel_event ()) != NULL) m++; |