* 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:
parent
f41d24a14d
commit
476dfb657b
@ -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.
|
||||||
|
@ -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) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user