* select.cc: Add more comments throughout. Use bool 'true' where appropriate
throughout. (fhandler_socket::select_read): Remove duplicate setting for *_ready which inadvertently overrode previous, correct setting. (fhandler_socket::select_write): Ditto.
This commit is contained in:
parent
79ec82139e
commit
915d1824f7
|
@ -1,3 +1,11 @@
|
||||||
|
2001-11-04 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* select.cc: Add more comments throughout. Use bool 'true' where
|
||||||
|
appropriate throughout.
|
||||||
|
(fhandler_socket::select_read): Remove duplicate setting for *_ready
|
||||||
|
which inadvertently overrode previous, correct setting.
|
||||||
|
(fhandler_socket::select_write): Ditto.
|
||||||
|
|
||||||
2001-11-03 Christopher Faylor <cgf@redhat.com>
|
2001-11-03 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* select.cc (verify_console): New function.
|
* select.cc (verify_console): New function.
|
||||||
|
|
|
@ -285,6 +285,10 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
|
||||||
select_printf ("woke up. wait_ret %d. verifying", wait_ret);
|
select_printf ("woke up. wait_ret %d. verifying", wait_ret);
|
||||||
s = &start;
|
s = &start;
|
||||||
int gotone = FALSE;
|
int gotone = FALSE;
|
||||||
|
/* Some types of object (e.g., consoles) wake up on "inappropriate" events
|
||||||
|
like mouse movements. The verify function will detect these situations.
|
||||||
|
If it returns false, then this wakeup was a false alarm and we should go
|
||||||
|
back to waiting. */
|
||||||
while ((s = s->next))
|
while ((s = s->next))
|
||||||
if (s->saw_error)
|
if (s->saw_error)
|
||||||
return -1; /* Somebody detected an error */
|
return -1; /* Somebody detected an error */
|
||||||
|
@ -392,7 +396,15 @@ peek_pipe (select_record *s, bool from_select)
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
set_handle_or_return_if_not_open (h, s);
|
set_handle_or_return_if_not_open (h, s);
|
||||||
|
|
||||||
|
/* pipes require a guard mutex to guard against the situation where multiple
|
||||||
|
readers are attempting to read from the same pipe. In this scenario, it
|
||||||
|
is possible for PeekNamedPipe to report available data to two readers but
|
||||||
|
only one will actually get the data. This will result in the other reader
|
||||||
|
entering fhandler_base::raw_read and blocking indefinitely in an interruptible
|
||||||
|
state. This causes things like "make -j2" to hang. So, for the non-select case
|
||||||
|
we use the pipe mutex, if it is available. */
|
||||||
HANDLE guard_mutex = from_select ? NULL : 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;
|
||||||
|
@ -412,7 +424,7 @@ peek_pipe (select_record *s, bool from_select)
|
||||||
case FH_TTYM:
|
case FH_TTYM:
|
||||||
if (((fhandler_pty_master *)fh)->need_nl)
|
if (((fhandler_pty_master *)fh)->need_nl)
|
||||||
{
|
{
|
||||||
gotone = s->read_ready = 1;
|
gotone = s->read_ready = true;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -420,14 +432,14 @@ peek_pipe (select_record *s, bool from_select)
|
||||||
if (fh->get_readahead_valid ())
|
if (fh->get_readahead_valid ())
|
||||||
{
|
{
|
||||||
select_printf ("readahead");
|
select_printf ("readahead");
|
||||||
gotone = s->read_ready = 1;
|
gotone = s->read_ready = true;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fh->bg_check (SIGTTIN) <= bg_eof)
|
if (fh->bg_check (SIGTTIN) <= bg_eof)
|
||||||
{
|
{
|
||||||
gotone = s->read_ready = 1;
|
gotone = s->read_ready = true;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -440,7 +452,7 @@ peek_pipe (select_record *s, bool from_select)
|
||||||
n = -1;
|
n = -1;
|
||||||
}
|
}
|
||||||
else if (!n || !guard_mutex)
|
else if (!n || !guard_mutex)
|
||||||
/* nothing */;
|
/* no guard mutex or nothing to read fromt he pipe. */;
|
||||||
else if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0)
|
else if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0)
|
||||||
{
|
{
|
||||||
select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (),
|
select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (),
|
||||||
|
@ -462,7 +474,7 @@ peek_pipe (select_record *s, bool from_select)
|
||||||
|
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
fh->set_eof ();
|
fh->set_eof (); /* Flag that other end of pipe is gone */
|
||||||
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;
|
||||||
|
@ -618,7 +630,7 @@ peek_console (select_record *me, bool)
|
||||||
if (fh->get_readahead_valid ())
|
if (fh->get_readahead_valid ())
|
||||||
{
|
{
|
||||||
select_printf ("readahead");
|
select_printf ("readahead");
|
||||||
return me->read_ready = 1;
|
return me->read_ready = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (me->read_ready)
|
if (me->read_ready)
|
||||||
|
@ -635,7 +647,7 @@ peek_console (select_record *me, bool)
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
if (fh->bg_check (SIGTTIN) <= bg_eof)
|
if (fh->bg_check (SIGTTIN) <= bg_eof)
|
||||||
return me->read_ready = 1;
|
return me->read_ready = true;
|
||||||
else if (!PeekConsoleInput (h, &irec, 1, &events_read) || !events_read)
|
else if (!PeekConsoleInput (h, &irec, 1, &events_read) || !events_read)
|
||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
|
@ -647,11 +659,11 @@ peek_console (select_record *me, bool)
|
||||||
irec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK))
|
irec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK))
|
||||||
{
|
{
|
||||||
if (fh->mouse_aware ())
|
if (fh->mouse_aware ())
|
||||||
return me->read_ready = 1;
|
return me->read_ready = true;
|
||||||
}
|
}
|
||||||
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 = true;
|
||||||
|
|
||||||
/* Read and discard the event */
|
/* Read and discard the event */
|
||||||
ReadConsoleInput (h, &irec, 1, &events_read);
|
ReadConsoleInput (h, &irec, 1, &events_read);
|
||||||
|
@ -743,7 +755,7 @@ verify_tty_slave (select_record *me, fd_set *readfds, fd_set *writefds,
|
||||||
fd_set *exceptfds)
|
fd_set *exceptfds)
|
||||||
{
|
{
|
||||||
if (WaitForSingleObject (me->h, 0) == WAIT_OBJECT_0)
|
if (WaitForSingleObject (me->h, 0) == WAIT_OBJECT_0)
|
||||||
me->read_ready = 1;
|
me->read_ready = true;
|
||||||
return set_bits (me, readfds, writefds, exceptfds);
|
return set_bits (me, readfds, writefds, exceptfds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -859,7 +871,7 @@ peek_serial (select_record *s, bool)
|
||||||
fhandler_serial *fh = (fhandler_serial *)s->fh;
|
fhandler_serial *fh = (fhandler_serial *)s->fh;
|
||||||
|
|
||||||
if (fh->get_readahead_valid () || fh->overlapped_armed < 0)
|
if (fh->get_readahead_valid () || fh->overlapped_armed < 0)
|
||||||
return s->read_ready = 1;
|
return s->read_ready = true;
|
||||||
|
|
||||||
select_printf ("fh->overlapped_armed %d", fh->overlapped_armed);
|
select_printf ("fh->overlapped_armed %d", fh->overlapped_armed);
|
||||||
|
|
||||||
|
@ -889,9 +901,9 @@ peek_serial (select_record *s, bool)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else if (st.cbInQue)
|
else if (st.cbInQue)
|
||||||
return s->read_ready = 1;
|
return s->read_ready = true;
|
||||||
else if (WaitCommEvent (h, &ev, &fh->io_status))
|
else if (WaitCommEvent (h, &ev, &fh->io_status))
|
||||||
return s->read_ready = 1;
|
return s->read_ready = true;
|
||||||
else if (GetLastError () == ERROR_IO_PENDING)
|
else if (GetLastError () == ERROR_IO_PENDING)
|
||||||
fh->overlapped_armed = 1;
|
fh->overlapped_armed = 1;
|
||||||
else
|
else
|
||||||
|
@ -920,7 +932,7 @@ peek_serial (select_record *s, bool)
|
||||||
Sleep (to);
|
Sleep (to);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return s->read_ready = 1;
|
return s->read_ready = true;
|
||||||
select_printf ("got something");
|
select_printf ("got something");
|
||||||
}
|
}
|
||||||
PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
|
PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
|
||||||
|
@ -1069,7 +1081,6 @@ fhandler_base::ready_for_read (int fd, DWORD howlong)
|
||||||
{
|
{
|
||||||
int avail = 0;
|
int avail = 0;
|
||||||
select_record me (this);
|
select_record me (this);
|
||||||
me.read_ready = false;
|
|
||||||
me.fd = fd;
|
me.fd = fd;
|
||||||
while (!avail)
|
while (!avail)
|
||||||
{
|
{
|
||||||
|
@ -1388,7 +1399,6 @@ fhandler_socket::select_read (select_record *s)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1405,7 +1415,6 @@ fhandler_socket::select_write (select_record *s)
|
||||||
s->peek = peek_socket;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue