Revert "Improve and simplify select()."

This reverts commit 472d0a228c.

Revert accidental push
This commit is contained in:
Corinna Vinschen 2016-03-20 21:59:27 +01:00
parent 1cca343e47
commit 66dc7d731a
3 changed files with 76 additions and 15 deletions

View File

@ -59,3 +59,30 @@ cygwait (DWORD howlong)
{ {
return cygwait (NULL, howlong); return cygwait (NULL, howlong);
} }
extern inline DWORD __attribute__ ((always_inline))
cygwait_us (HANDLE h, LONGLONG howlong, unsigned mask)
{
LARGE_INTEGER li_howlong;
PLARGE_INTEGER pli_howlong;
if (howlong < 0LL)
pli_howlong = NULL;
else
{
li_howlong.QuadPart = -(10LL * howlong);
pli_howlong = &li_howlong;
}
return cygwait (h, pli_howlong, mask);
}
static inline DWORD __attribute__ ((always_inline))
cygwait_us (HANDLE h, LONGLONG howlong = -1)
{
return cygwait_us (h, howlong, cw_cancel | cw_sig);
}
static inline DWORD __attribute__ ((always_inline))
cygwait_us (LONGLONG howlong)
{
return cygwait_us (NULL, howlong);
}

View File

@ -32,6 +32,7 @@ details. */
#include "pinfo.h" #include "pinfo.h"
#include "sigproc.h" #include "sigproc.h"
#include "cygtls.h" #include "cygtls.h"
#include "cygwait.h"
/* /*
* All these defines below should be in sys/types.h * All these defines below should be in sys/types.h
@ -155,7 +156,7 @@ static int
select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
LONGLONG us) LONGLONG us)
{ {
select_stuff::wait_states wait_state = select_stuff::select_set_zero; select_stuff::wait_states wait_state = select_stuff::select_loop;
int ret = 0; int ret = 0;
/* Record the current time for later use. */ /* Record the current time for later use. */
@ -181,7 +182,30 @@ select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
} }
select_printf ("sel.always_ready %d", sel.always_ready); select_printf ("sel.always_ready %d", sel.always_ready);
if (sel.always_ready || us == 0) /* Degenerate case. No fds to wait for. Just wait for time to run out
or signal to arrive. */
if (sel.start.next == NULL)
switch (cygwait_us (us))
{
case WAIT_SIGNALED:
select_printf ("signal received");
/* select() is always interrupted by a signal so set EINTR,
unconditionally, ignoring any SA_RESTART detection by
call_signal_handler(). */
_my_tls.call_signal_handler ();
set_sig_errno (EINTR);
wait_state = select_stuff::select_signalled;
break;
case WAIT_CANCELED:
sel.destroy ();
pthread::static_cancel_self ();
/*NOTREACHED*/
default:
/* Set wait_state to zero below. */
wait_state = select_stuff::select_set_zero;
break;
}
else if (sel.always_ready || us == 0)
/* Catch any active fds via sel.poll() below */ /* Catch any active fds via sel.poll() below */
wait_state = select_stuff::select_ok; wait_state = select_stuff::select_ok;
else else
@ -190,24 +214,29 @@ select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
select_printf ("sel.wait returns %d", wait_state); select_printf ("sel.wait returns %d", wait_state);
if (wait_state == select_stuff::select_ok) if (wait_state >= select_stuff::select_ok)
{ {
UNIX_FD_ZERO (readfds, maxfds); UNIX_FD_ZERO (readfds, maxfds);
UNIX_FD_ZERO (writefds, maxfds); UNIX_FD_ZERO (writefds, maxfds);
UNIX_FD_ZERO (exceptfds, maxfds); UNIX_FD_ZERO (exceptfds, maxfds);
/* Set bit mask from sel records. This also sets ret to the if (wait_state == select_stuff::select_set_zero)
right value >= 0, matching the number of bits set in the ret = 0;
fds records. if ret is 0, continue to loop. */ else
ret = sel.poll (readfds, writefds, exceptfds); {
if (!ret) /* Set bit mask from sel records. This also sets ret to the
wait_state = select_stuff::select_set_zero; right value >= 0, matching the number of bits set in the
fds records. if ret is 0, continue to loop. */
ret = sel.poll (readfds, writefds, exceptfds);
if (!ret)
wait_state = select_stuff::select_loop;
}
} }
/* Always clean up everything here. If we're looping then build it /* Always clean up everything here. If we're looping then build it
all up again. */ all up again. */
sel.cleanup (); sel.cleanup ();
sel.destroy (); sel.destroy ();
/* Check and recalculate timeout. */ /* Recalculate time remaining to wait if we are going to be looping. */
if (us != -1LL && wait_state == select_stuff::select_set_zero) if (wait_state == select_stuff::select_loop && us != -1)
{ {
select_printf ("recalculating us"); select_printf ("recalculating us");
LONGLONG now = gtod.usecs (); LONGLONG now = gtod.usecs ();
@ -229,7 +258,7 @@ select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
} }
} }
} }
while (wait_state == select_stuff::select_set_zero); while (wait_state == select_stuff::select_loop);
if (wait_state < select_stuff::select_ok) if (wait_state < select_stuff::select_ok)
ret = -1; ret = -1;
@ -465,7 +494,7 @@ next_while:;
to wait for. */ to wait for. */
default: default:
s = &start; s = &start;
res = select_set_zero; bool gotone = false;
/* Some types of objects (e.g., consoles) wake up on "inappropriate" /* Some types of objects (e.g., consoles) wake up on "inappropriate"
events like mouse movements. The verify function will detect these events like mouse movements. The verify function will detect these
situations. If it returns false, then this wakeup was a false alarm situations. If it returns false, then this wakeup was a false alarm
@ -479,9 +508,13 @@ next_while:;
} }
else if ((((wait_ret >= m && s->windows_handle) || s->h == w4[wait_ret])) else if ((((wait_ret >= m && s->windows_handle) || s->h == w4[wait_ret]))
&& s->verify (s, readfds, writefds, exceptfds)) && s->verify (s, readfds, writefds, exceptfds))
res = select_ok; gotone = true;
select_printf ("res after verify %d", res); if (!gotone)
res = select_loop;
else
res = select_ok;
select_printf ("gotone %d", gotone);
break; break;
} }
out: out:

View File

@ -78,6 +78,7 @@ public:
enum wait_states enum wait_states
{ {
select_signalled = -3, select_signalled = -3,
select_loop = -2,
select_error = -1, select_error = -1,
select_ok = 0, select_ok = 0,
select_set_zero = 1 select_set_zero = 1