* fhandler.h (fhandler_base::ready_for_read): Remove unused argument.

(fhandler_tty_slave::ready_for_read): Ditto.
(select_record): Remove poll, initialize peek.
* select.cc: Remove all poll functions, throughout.  Change second argument of
peek_* functions to 'bool' throughout.  Specifically initialize *_ready
variables throughout.
(select_stuff::poll): Subsume previous poll functionality.
(peek_pipe): Don't grab guard mutex when in select loop.  select()/read() is
racy by design so there is no need to worry about a race in select().
(fhandler_base::ready_for_read): Remove unused argument.
(fhandler_tty_slave::ready_for_read): Ditto.
* syscalls.cc (_read): Eliminate third argument in ready_for_read call.
This commit is contained in:
Christopher Faylor 2001-11-04 02:31:58 +00:00
parent f41d24a14d
commit 476dfb657b
4 changed files with 128 additions and 162 deletions

View File

@ -1,3 +1,19 @@
2001-11-03 Christopher Faylor <cgf@redhat.com>
* fhandler.h (fhandler_base::ready_for_read): Remove unused argument.
(fhandler_tty_slave::ready_for_read): Ditto.
(select_record): Remove poll, initialize peek.
* select.cc: Remove all poll functions, throughout. Change second
argument of peek_* functions to 'bool' throughout. Specifically
initialize *_ready variables throughout.
(select_stuff::poll): Subsume previous poll functionality.
(peek_pipe): Don't grab guard mutex when in select loop.
select()/read() is racy by design so there is no need to worry about a
race in select().
(fhandler_base::ready_for_read): Remove unused argument.
(fhandler_tty_slave::ready_for_read): Ditto.
* syscalls.cc (_read): Eliminate third argument in ready_for_read call.
2001-11-03 Corinna Vinschen <corinna@vinschen.de> 2001-11-03 Corinna Vinschen <corinna@vinschen.de>
* security.cc (get_supplementary_group_sidlist): New function. * security.cc (get_supplementary_group_sidlist): New function.

View File

@ -324,7 +324,7 @@ class fhandler_base
virtual select_record *select_read (select_record *s); virtual select_record *select_read (select_record *s);
virtual select_record *select_write (select_record *s); virtual select_record *select_write (select_record *s);
virtual select_record *select_except (select_record *s); virtual select_record *select_except (select_record *s);
virtual int ready_for_read (int fd, DWORD howlong, int ignra); virtual int ready_for_read (int fd, DWORD howlong);
virtual const char * get_native_name () virtual const char * get_native_name ()
{ {
return windows_device_names[FHDEVN (status)]; return windows_device_names[FHDEVN (status)];
@ -793,7 +793,7 @@ class fhandler_tty_slave: public fhandler_tty_common
off_t lseek (off_t, int) { return 0; } off_t lseek (off_t, int) { return 0; }
select_record *select_read (select_record *s); select_record *select_read (select_record *s);
int ready_for_read (int fd, DWORD howlong, int ignra); int ready_for_read (int fd, DWORD howlong);
}; };
class fhandler_pty_master: public fhandler_tty_common class fhandler_pty_master: public fhandler_tty_common
@ -1017,9 +1017,7 @@ struct select_record
bool read_ready, write_ready, except_ready; bool read_ready, write_ready, except_ready;
bool read_selected, write_selected, except_selected; bool read_selected, write_selected, except_selected;
int (*startup) (select_record *me, class select_stuff *stuff); int (*startup) (select_record *me, class select_stuff *stuff);
int (*poll) (select_record *me, fd_set *readfds, fd_set *writefds, int (*peek) (select_record *, bool);
fd_set *exceptfds);
int (*peek) (select_record *, int);
int (*verify) (select_record *me, fd_set *readfds, fd_set *writefds, int (*verify) (select_record *me, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds); fd_set *exceptfds);
void (*cleanup) (select_record *me, class select_stuff *stuff); void (*cleanup) (select_record *me, class select_stuff *stuff);
@ -1029,7 +1027,7 @@ struct select_record
fh (in_fh), saw_error (0), windows_handle (0), fh (in_fh), saw_error (0), windows_handle (0),
read_ready (0), write_ready (0), except_ready (0), read_ready (0), write_ready (0), except_ready (0),
read_selected (0), write_selected (0), except_selected (0), read_selected (0), write_selected (0), except_selected (0),
startup (NULL), poll (NULL), verify (NULL), cleanup (NULL), startup (NULL), peek (NULL), verify (NULL), cleanup (NULL),
next (NULL) {} next (NULL) {}
}; };

View File

@ -88,7 +88,7 @@ typedef long fd_mask;
h = (s)->fh->get_handle (); \ h = (s)->fh->get_handle (); \
if (cygheap->fdtab.not_open ((s)->fd)) \ if (cygheap->fdtab.not_open ((s)->fd)) \
{ \ { \
(s)->saw_error = TRUE; \ (s)->saw_error = true; \
set_errno (EBADF); \ set_errno (EBADF); \
return -1; \ return -1; \
} \ } \
@ -210,28 +210,16 @@ select_stuff::test_and_set (int i, fd_set *readfds, fd_set *writefds,
return 1; /* nothing to do */ return 1; /* nothing to do */
if (s->read_ready || s->write_ready || s->except_ready) if (s->read_ready || s->write_ready || s->except_ready)
always_ready = TRUE; always_ready = true;
if (s->windows_handle || s->windows_handle || s->windows_handle) if (s->windows_handle || s->windows_handle || s->windows_handle)
windows_used = TRUE; windows_used = true;
s->next = start.next; s->next = start.next;
start.next = s; start.next = s;
return 1; return 1;
} }
/* Poll every fd in the select chain. Set appropriate fd in mask. */
int
select_stuff::poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds)
{
int n = 0;
select_record *s = &start;
while ((s = s->next))
n += s->poll (s, readfds, writefds, exceptfds);
select_printf ("returning %d", n);
return n;
}
/* The heart of select. Waits for an fd to do something interesting. */ /* The heart of select. Waits for an fd to do something interesting. */
int int
select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
@ -302,7 +290,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
return -1; /* Somebody detected an error */ return -1; /* Somebody detected an error */
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))
gotone = TRUE; gotone = true;
select_printf ("gotone %d", gotone); select_printf ("gotone %d", gotone);
if (gotone) if (gotone)
@ -356,6 +344,19 @@ set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
return ready; return ready;
} }
/* Poll every fd in the select chain. Set appropriate fd in mask. */
int
select_stuff::poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds)
{
int n = 0;
select_record *s = &start;
while ((s = s->next))
n += (!s->peek || s->peek (s, true)) ?
set_bits (s, readfds, writefds, exceptfds) : 0;
select_printf ("returning %d", n);
return n;
}
static int static int
verify_true (select_record *, fd_set *, fd_set *, fd_set *) verify_true (select_record *, fd_set *, fd_set *, fd_set *)
{ {
@ -382,7 +383,7 @@ no_verify (select_record *, fd_set *, fd_set *, fd_set *)
} }
static int static int
peek_pipe (select_record *s, int ignra) peek_pipe (select_record *s, bool from_select)
{ {
int n = 0; int n = 0;
int gotone = 0; int gotone = 0;
@ -391,7 +392,7 @@ peek_pipe (select_record *s, int ignra)
HANDLE h; HANDLE h;
set_handle_or_return_if_not_open (h, s); set_handle_or_return_if_not_open (h, s);
HANDLE guard_mutex = fh->get_guard (); HANDLE guard_mutex = from_select ? NULL : fh->get_guard ();
/* Don't perform complicated tests if we don't need to. */ /* Don't perform complicated tests if we don't need to. */
if (!s->read_selected && !s->except_selected) if (!s->read_selected && !s->except_selected)
goto out; goto out;
@ -416,7 +417,7 @@ peek_pipe (select_record *s, int ignra)
} }
break; break;
default: default:
if (!ignra && fh->get_readahead_valid ()) if (fh->get_readahead_valid ())
{ {
select_printf ("readahead"); select_printf ("readahead");
gotone = s->read_ready = 1; gotone = s->read_ready = 1;
@ -464,22 +465,22 @@ peek_pipe (select_record *s, int ignra)
fh->set_eof (); fh->set_eof ();
select_printf ("%s, n %d", fh->get_name (), n); select_printf ("%s, n %d", fh->get_name (), n);
if (s->except_selected) if (s->except_selected)
gotone += s->except_ready = TRUE; gotone += s->except_ready = true;
if (s->read_selected) if (s->read_selected)
gotone += s->read_ready = TRUE; gotone += s->read_ready = true;
} }
if (n > 0 && s->read_selected) if (n > 0 && s->read_selected)
{ {
select_printf ("%s, ready for read", fh->get_name ()); select_printf ("%s, ready for read", fh->get_name ());
gotone += s->read_ready = TRUE; gotone += s->read_ready = true;
} }
if (!gotone && s->fh->hit_eof ()) if (!gotone && s->fh->hit_eof ())
{ {
select_printf ("%s, saw EOF", fh->get_name ()); select_printf ("%s, saw EOF", fh->get_name ());
if (s->except_selected) if (s->except_selected)
gotone = s->except_ready = TRUE; gotone = s->except_ready = true;
if (s->read_selected) if (s->read_selected)
gotone += s->read_ready = TRUE; gotone += s->read_ready = true;
select_printf ("saw eof on '%s'", fh->get_name ()); select_printf ("saw eof on '%s'", fh->get_name ());
} }
@ -487,15 +488,6 @@ out:
return gotone || s->write_ready; return gotone || s->write_ready;
} }
static int
poll_pipe (select_record *me, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds)
{
return peek_pipe (me, 0) ?
set_bits (me, readfds, writefds, exceptfds) :
0;
}
static int start_thread_pipe (select_record *me, select_stuff *stuff); static int start_thread_pipe (select_record *me, select_stuff *stuff);
struct pipeinf struct pipeinf
@ -517,8 +509,8 @@ thread_pipe (void *arg)
while ((s = s->next)) while ((s = s->next))
if (s->startup == start_thread_pipe) if (s->startup == start_thread_pipe)
{ {
if (peek_pipe (s, 0)) if (peek_pipe (s, true))
gotone = TRUE; gotone = true;
if (pi->stop_thread_pipe) if (pi->stop_thread_pipe)
{ {
select_printf ("stopping"); select_printf ("stopping");
@ -563,7 +555,7 @@ pipe_cleanup (select_record *, select_stuff *stuff)
pipeinf *pi = (pipeinf *)stuff->device_specific[FHDEVN(FH_PIPE)]; pipeinf *pi = (pipeinf *)stuff->device_specific[FHDEVN(FH_PIPE)];
if (pi && pi->thread) if (pi && pi->thread)
{ {
pi->stop_thread_pipe = TRUE; pi->stop_thread_pipe = true;
WaitForSingleObject (pi->thread, INFINITE); WaitForSingleObject (pi->thread, INFINITE);
CloseHandle (pi->thread); CloseHandle (pi->thread);
delete pi; delete pi;
@ -577,10 +569,10 @@ fhandler_pipe::select_read (select_record *s)
if (!s) if (!s)
s = new select_record; s = new select_record;
s->startup = start_thread_pipe; s->startup = start_thread_pipe;
s->poll = poll_pipe;
s->peek = peek_pipe; s->peek = peek_pipe;
s->verify = verify_ok; s->verify = verify_ok;
s->read_selected = TRUE; s->read_selected = true;
s->read_ready = false;
s->cleanup = pipe_cleanup; s->cleanup = pipe_cleanup;
return s; return s;
} }
@ -592,11 +584,11 @@ fhandler_pipe::select_write (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = poll_pipe;
s->verify = no_verify; s->verify = no_verify;
} }
s->write_selected = TRUE; s->peek = peek_pipe;
s->write_ready = TRUE; s->write_selected = true;
s->write_ready = true;
return s; return s;
} }
@ -606,15 +598,16 @@ fhandler_pipe::select_except (select_record *s)
if (!s) if (!s)
s = new select_record; s = new select_record;
s->startup = start_thread_pipe; s->startup = start_thread_pipe;
s->poll = poll_pipe; s->peek = peek_pipe;
s->verify = verify_ok; s->verify = verify_ok;
s->cleanup = pipe_cleanup; s->cleanup = pipe_cleanup;
s->except_selected = TRUE; s->except_selected = true;
s->except_ready = false;
return s; return s;
} }
static int static int
peek_console (select_record *me, int ignra) peek_console (select_record *me, bool)
{ {
extern const char * get_nonascii_key (INPUT_RECORD& input_rec, char *); extern const char * get_nonascii_key (INPUT_RECORD& input_rec, char *);
fhandler_console *fh = (fhandler_console *)me->fh; fhandler_console *fh = (fhandler_console *)me->fh;
@ -622,7 +615,7 @@ peek_console (select_record *me, int ignra)
if (!me->read_selected) if (!me->read_selected)
return me->write_ready; return me->write_ready;
if (!ignra && fh->get_readahead_valid ()) if (fh->get_readahead_valid ())
{ {
select_printf ("readahead"); select_printf ("readahead");
return me->read_ready = 1; return me->read_ready = 1;
@ -656,7 +649,7 @@ peek_console (select_record *me, int ignra)
if (fh->mouse_aware ()) if (fh->mouse_aware ())
return me->read_ready = 1; return me->read_ready = 1;
} }
else if (irec.EventType == KEY_EVENT && irec.Event.KeyEvent.bKeyDown == TRUE && else if (irec.EventType == KEY_EVENT && irec.Event.KeyEvent.bKeyDown == true &&
(irec.Event.KeyEvent.uChar.AsciiChar || get_nonascii_key (irec, tmpbuf))) (irec.Event.KeyEvent.uChar.AsciiChar || get_nonascii_key (irec, tmpbuf)))
return me->read_ready = 1; return me->read_ready = 1;
@ -667,15 +660,6 @@ peek_console (select_record *me, int ignra)
return me->write_ready; return me->write_ready;
} }
static int
poll_console (select_record *me, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds)
{
return peek_console (me, 0) ?
set_bits (me, readfds, writefds, exceptfds) :
0;
}
select_record * select_record *
fhandler_console::select_read (select_record *s) fhandler_console::select_read (select_record *s)
{ {
@ -683,14 +667,14 @@ fhandler_console::select_read (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = poll_console; s->verify = verify_ok;
s->verify = poll_console;
set_cursor_maybe (); set_cursor_maybe ();
} }
s->peek = peek_console; s->peek = peek_console;
s->h = get_handle (); s->h = get_handle ();
s->read_selected = TRUE; s->read_selected = true;
s->read_ready = false;
return s; return s;
} }
@ -701,13 +685,13 @@ fhandler_console::select_write (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = poll_console;
s->verify = no_verify; s->verify = no_verify;
set_cursor_maybe (); set_cursor_maybe ();
} }
s->write_selected = TRUE; s->peek = peek_console;
s->write_ready = TRUE; s->write_selected = true;
s->write_ready = true;
return s; return s;
} }
@ -718,12 +702,13 @@ fhandler_console::select_except (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = poll_console;
s->verify = no_verify; s->verify = no_verify;
set_cursor_maybe (); set_cursor_maybe ();
} }
s->except_selected = TRUE; s->peek = peek_console;
s->except_selected = true;
s->except_ready = false;
return s; return s;
} }
@ -761,16 +746,16 @@ fhandler_tty_slave::select_read (select_record *s)
s = new select_record; s = new select_record;
s->h = input_available_event; s->h = input_available_event;
s->startup = no_startup; s->startup = no_startup;
s->poll = poll_pipe;
s->peek = peek_pipe; s->peek = peek_pipe;
s->verify = verify_tty_slave; s->verify = verify_tty_slave;
s->read_selected = TRUE; s->read_selected = true;
s->read_ready = false;
s->cleanup = NULL; s->cleanup = NULL;
return s; return s;
} }
int int
fhandler_tty_slave::ready_for_read (int fd, DWORD howlong, int ignra) fhandler_tty_slave::ready_for_read (int fd, DWORD howlong)
{ {
HANDLE w4[2]; HANDLE w4[2];
if (!cygheap->fdtab.not_open (fd)) if (!cygheap->fdtab.not_open (fd))
@ -778,7 +763,7 @@ fhandler_tty_slave::ready_for_read (int fd, DWORD howlong, int ignra)
set_errno (EBADF); set_errno (EBADF);
return 1; return 1;
} }
if (!ignra && get_readahead_valid ()) if (get_readahead_valid ())
{ {
select_printf ("readahead"); select_printf ("readahead");
return 1; return 1;
@ -810,12 +795,11 @@ fhandler_dev_null::select_read (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = no_verify; s->verify = no_verify;
} }
s->h = get_handle (); s->h = get_handle ();
s->read_selected = TRUE; s->read_selected = true;
s->read_ready = TRUE; s->read_ready = true;
return s; return s;
} }
@ -826,12 +810,11 @@ fhandler_dev_null::select_write (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = no_verify; s->verify = no_verify;
} }
s->h = get_handle (); s->h = get_handle ();
s->write_selected = TRUE; s->write_selected = true;
s->write_ready = TRUE; s->write_ready = true;
return s; return s;
} }
@ -842,12 +825,11 @@ fhandler_dev_null::select_except (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = no_verify; s->verify = no_verify;
} }
s->h = get_handle (); s->h = get_handle ();
s->except_selected = TRUE; s->except_selected = true;
s->except_ready = TRUE; s->except_ready = true;
return s; return s;
} }
@ -861,7 +843,7 @@ struct serialinf
}; };
static int static int
peek_serial (select_record *s, int) peek_serial (select_record *s, bool)
{ {
DWORD ev; DWORD ev;
COMSTAT st; COMSTAT st;
@ -961,7 +943,7 @@ err:
} }
__seterrno (); __seterrno ();
s->saw_error = TRUE; s->saw_error = true;
select_printf ("error %E"); select_printf ("error %E");
return -1; return -1;
} }
@ -978,8 +960,8 @@ thread_serial (void *arg)
while ((s = s->next)) while ((s = s->next))
if (s->startup == start_thread_serial) if (s->startup == start_thread_serial)
{ {
if (peek_serial (s, 0)) if (peek_serial (s, true))
gotone = TRUE; gotone = true;
} }
if (si->stop_thread_serial) if (si->stop_thread_serial)
{ {
@ -1018,7 +1000,7 @@ serial_cleanup (select_record *, select_stuff *stuff)
serialinf *si = (serialinf *)stuff->device_specific[FHDEVN(FH_SERIAL)]; serialinf *si = (serialinf *)stuff->device_specific[FHDEVN(FH_SERIAL)];
if (si && si->thread) if (si && si->thread)
{ {
si->stop_thread_serial = TRUE; si->stop_thread_serial = true;
WaitForSingleObject (si->thread, INFINITE); WaitForSingleObject (si->thread, INFINITE);
CloseHandle (si->thread); CloseHandle (si->thread);
delete si; delete si;
@ -1026,16 +1008,6 @@ serial_cleanup (select_record *, select_stuff *stuff)
} }
} }
static int
poll_serial (select_record *me, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds)
{
return peek_serial (me, 0) ?
set_bits (me, readfds, writefds, exceptfds) :
0;
}
select_record * select_record *
fhandler_serial::select_read (select_record *s) fhandler_serial::select_read (select_record *s)
{ {
@ -1043,12 +1015,12 @@ fhandler_serial::select_read (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = start_thread_serial; s->startup = start_thread_serial;
s->poll = poll_serial;
s->verify = verify_ok; s->verify = verify_ok;
s->cleanup = serial_cleanup; s->cleanup = serial_cleanup;
} }
s->peek = peek_serial; s->peek = peek_serial;
s->read_selected = TRUE; s->read_selected = true;
s->read_ready = false;
return s; return s;
} }
@ -1059,12 +1031,12 @@ fhandler_serial::select_write (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = verify_ok; s->verify = verify_ok;
} }
s->peek = peek_serial;
s->h = get_handle (); s->h = get_handle ();
s->write_selected = TRUE; s->write_selected = true;
s->write_ready = TRUE; s->write_ready = true;
return s; return s;
} }
@ -1075,16 +1047,17 @@ fhandler_serial::select_except (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = verify_ok; s->verify = verify_ok;
} }
s->h = NULL; s->h = NULL;
s->except_selected = FALSE; // Can't do this s->peek = peek_serial;
s->except_selected = false; // Can't do this
s->except_ready = false;
return s; return s;
} }
int int
fhandler_base::ready_for_read (int fd, DWORD howlong, int ignra) fhandler_base::ready_for_read (int fd, DWORD howlong)
{ {
int avail = 0; int avail = 0;
select_record me (this); select_record me (this);
@ -1093,7 +1066,7 @@ fhandler_base::ready_for_read (int fd, DWORD howlong, int ignra)
while (!avail) while (!avail)
{ {
(void) select_read (&me); (void) select_read (&me);
avail = me.read_ready ?: me.peek (&me, ignra); avail = me.read_ready ?: me.peek (&me, false);
if (fd >= 0 && cygheap->fdtab.not_open (fd)) if (fd >= 0 && cygheap->fdtab.not_open (fd))
{ {
@ -1131,12 +1104,11 @@ fhandler_base::select_read (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = verify_ok; s->verify = verify_ok;
} }
s->h = get_handle (); s->h = get_handle ();
s->read_selected = TRUE; s->read_selected = true;
s->read_ready = TRUE; s->read_ready = true;
return s; return s;
} }
@ -1147,12 +1119,11 @@ fhandler_base::select_write (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = verify_ok; s->verify = verify_ok;
} }
s->h = get_handle (); s->h = get_handle ();
s->write_selected = TRUE; s->write_selected = true;
s->write_ready = TRUE; s->write_ready = true;
return s; return s;
} }
@ -1163,11 +1134,11 @@ fhandler_base::select_except (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = verify_ok; s->verify = verify_ok;
} }
s->h = NULL; s->h = NULL;
s->write_selected = TRUE; s->except_selected = true;
s->except_ready = false;
return s; return s;
} }
@ -1181,7 +1152,7 @@ struct socketinf
}; };
static int static int
peek_socket (select_record *me, int) peek_socket (select_record *me, bool)
{ {
winsock_fd_set ws_readfds, ws_writefds, ws_exceptfds; winsock_fd_set ws_readfds, ws_writefds, ws_exceptfds;
struct timeval tv = {0, 0}; struct timeval tv = {0, 0};
@ -1221,23 +1192,14 @@ peek_socket (select_record *me, int)
} }
if (WINSOCK_FD_ISSET (h, &ws_readfds) || (me->read_selected && me->read_ready)) if (WINSOCK_FD_ISSET (h, &ws_readfds) || (me->read_selected && me->read_ready))
me->read_ready = TRUE; me->read_ready = true;
if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready)) if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready))
me->write_ready = TRUE; me->write_ready = true;
if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready)) if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready))
me->except_ready = TRUE; me->except_ready = true;
return me->read_ready || me->write_ready || me->except_ready; return me->read_ready || me->write_ready || me->except_ready;
} }
static int
poll_socket (select_record *me, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds)
{
return peek_socket (me, 0) ?
set_bits (me, readfds, writefds, exceptfds) :
0;
}
static int start_thread_socket (select_record *, select_stuff *); static int start_thread_socket (select_record *, select_stuff *);
static DWORD WINAPI static DWORD WINAPI
@ -1259,17 +1221,17 @@ thread_socket (void *arg)
if (WINSOCK_FD_ISSET (h, &si->readfds)) if (WINSOCK_FD_ISSET (h, &si->readfds))
{ {
select_printf ("read_ready"); select_printf ("read_ready");
s->read_ready = TRUE; s->read_ready = true;
} }
if (WINSOCK_FD_ISSET (h, &si->writefds)) if (WINSOCK_FD_ISSET (h, &si->writefds))
{ {
select_printf ("write_ready"); select_printf ("write_ready");
s->write_ready = TRUE; s->write_ready = true;
} }
if (WINSOCK_FD_ISSET (h, &si->exceptfds)) if (WINSOCK_FD_ISSET (h, &si->exceptfds))
{ {
select_printf ("except_ready"); select_printf ("except_ready");
s->except_ready = TRUE; s->except_ready = true;
} }
} }
@ -1412,13 +1374,13 @@ fhandler_socket::select_read (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = start_thread_socket; s->startup = start_thread_socket;
s->poll = poll_socket;
s->verify = verify_true; s->verify = verify_true;
s->cleanup = socket_cleanup; s->cleanup = socket_cleanup;
} }
s->peek = peek_socket; s->peek = peek_socket;
s->read_ready = saw_shutdown_read (); s->read_ready = saw_shutdown_read ();
s->read_selected = TRUE; s->read_selected = true;
s->read_ready = false;
return s; return s;
} }
@ -1429,12 +1391,13 @@ fhandler_socket::select_write (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = start_thread_socket; s->startup = start_thread_socket;
s->poll = poll_socket;
s->verify = verify_true; s->verify = verify_true;
s->cleanup = socket_cleanup; s->cleanup = socket_cleanup;
} }
s->peek = peek_socket;
s->write_ready = saw_shutdown_write (); s->write_ready = saw_shutdown_write ();
s->write_selected = TRUE; s->write_selected = true;
s->write_ready = false;
return s; return s;
} }
@ -1445,18 +1408,18 @@ fhandler_socket::select_except (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = start_thread_socket; s->startup = start_thread_socket;
s->poll = poll_socket;
s->verify = verify_true; s->verify = verify_true;
s->cleanup = socket_cleanup; s->cleanup = socket_cleanup;
} }
s->peek = peek_socket;
/* FIXME: Is this right? Should these be used as criteria for except? */ /* FIXME: Is this right? Should these be used as criteria for except? */
s->except_ready = saw_shutdown_write () || saw_shutdown_read (); s->except_ready = saw_shutdown_write () || saw_shutdown_read ();
s->except_selected = TRUE; s->except_selected = true;
return s; return s;
} }
static int static int
peek_windows (select_record *me, int) peek_windows (select_record *me, bool)
{ {
MSG m; MSG m;
HANDLE h; HANDLE h;
@ -1467,7 +1430,7 @@ peek_windows (select_record *me, int)
if (PeekMessage (&m, (HWND) h, 0, 0, PM_NOREMOVE)) if (PeekMessage (&m, (HWND) h, 0, 0, PM_NOREMOVE))
{ {
me->read_ready = TRUE; me->read_ready = true;
select_printf ("window %d(%p) ready", me->fd, me->fh->get_handle ()); select_printf ("window %d(%p) ready", me->fd, me->fh->get_handle ());
return 1; return 1;
} }
@ -1476,16 +1439,6 @@ peek_windows (select_record *me, int)
return me->write_ready; return me->write_ready;
} }
static int
poll_windows (select_record *me, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds)
{
return peek_windows (me, 0) ?
set_bits (me, readfds, writefds, exceptfds) :
0;
}
select_record * select_record *
fhandler_windows::select_read (select_record *s) fhandler_windows::select_read (select_record *s)
{ {
@ -1493,14 +1446,13 @@ fhandler_windows::select_read (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = poll_windows; s->verify = verify_ok;
s->verify = poll_windows;
} }
s->peek = peek_windows; s->peek = peek_windows;
s->read_selected = true;
s->read_ready = false;
s->h = get_handle (); s->h = get_handle ();
s->read_selected = TRUE; s->windows_handle = true;
s->h = get_handle ();
s->windows_handle = TRUE;
return s; return s;
} }
@ -1511,13 +1463,13 @@ fhandler_windows::select_write (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = verify_ok; s->verify = verify_ok;
} }
s->peek = peek_windows;
s->h = get_handle (); s->h = get_handle ();
s->write_selected = TRUE; s->write_selected = true;
s->write_ready = TRUE; s->write_ready = true;
s->windows_handle = TRUE; s->windows_handle = true;
return s; return s;
} }
@ -1528,12 +1480,12 @@ fhandler_windows::select_except (select_record *s)
{ {
s = new select_record; s = new select_record;
s->startup = no_startup; s->startup = no_startup;
s->poll = set_bits;
s->verify = verify_ok; s->verify = verify_ok;
} }
s->peek = peek_windows;
s->h = get_handle (); s->h = get_handle ();
s->except_selected = TRUE; s->except_selected = true;
s->except_ready = TRUE; s->except_ready = true;
s->windows_handle = TRUE; s->windows_handle = true;
return s; return s;
} }

View File

@ -312,7 +312,7 @@ _read (int fd, void *ptr, size_t len)
if (wait && (!cfd->is_slow () || cfd->get_r_no_interrupt ())) if (wait && (!cfd->is_slow () || cfd->get_r_no_interrupt ()))
debug_printf ("non-interruptible read\n"); debug_printf ("non-interruptible read\n");
else if (!cfd->ready_for_read (fd, wait, 0)) else if (!cfd->ready_for_read (fd, wait))
{ {
res = -1; res = -1;
goto out; goto out;