* DevNotes: Add entry cgf-000021.

* select.cc (select): Unconditionally return when a signal is detected.
(select_stuff::wait): Ditto.
This commit is contained in:
Christopher Faylor 2013-01-11 15:36:40 +00:00
parent 0ad26aec5b
commit 2f47bbd555
4 changed files with 29 additions and 16 deletions

View File

@ -1,3 +1,9 @@
2013-01-11 Christopher Faylor <me.cygwin2013@cgf.cx>
* DevNotes: Add entry cgf-000021.
* select.cc (select): Unconditionally return when a signal is detected.
(select_stuff::wait): Ditto.
2013-01-11 Corinna Vinschen <corinna@vinschen.de>
* syscalls.cc (rename): Drop handling paths > 32757 chars, emit EINVAL

View File

@ -1,3 +1,12 @@
2013-01-11 cgf-000021
Apparently I got the signal handling semantics of select() wrong again
even though I would have sworn that I tested this on Linux and Windows.
select() is apparently *always* interrupted by a signal and *never*
restarts. Hopefully, between the comment added to the code and this
note, I'll not make this mistake again.
2013-01-02 cgf-000020
(This entry should have been checked in with the changes but... I forgot)

View File

@ -1,7 +1,7 @@
/* globals.cc - Define global variables here.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc.
2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc.
This file is part of Cygwin.

View File

@ -1,7 +1,7 @@
/* select.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc.
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc.
This file is part of Cygwin.
@ -165,13 +165,12 @@ select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
{
case WAIT_SIGNALED:
select_printf ("signal received");
if (_my_tls.call_signal_handler ())
res = select_stuff::select_loop; /* Emulate linux behavior */
else
{
set_sig_errno (EINTR);
res = select_stuff::select_error;
}
/* 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);
res = select_stuff::select_signalled;
break;
case WAIT_CANCELED:
sel.destroy ();
@ -404,13 +403,12 @@ next_while:;
be assured that a signal handler won't jump out of select entirely. */
cleanup ();
destroy ();
if (_my_tls.call_signal_handler ())
res = select_loop;
else
{
set_sig_errno (EINTR);
res = select_signalled; /* Cause loop exit in cygwin_select */
}
/* 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);
res = select_signalled; /* Cause loop exit in cygwin_select */
break;
case WAIT_FAILED:
system_printf ("WaitForMultipleObjects failed, %E");