aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2013-01-11 15:36:40 +0000
committerChristopher Faylor <me@cgf.cx>2013-01-11 15:36:40 +0000
commit2f47bbd55583be9b24bee039e6b7f35e3727b8de (patch)
treebb9cd528ba8480fd8d40977ffb54727b28fc1a67 /winsup/cygwin
parent0ad26aec5b71b1b4c8ebf9c7b395cc3d0d89c18f (diff)
downloadnewlib-2f47bbd55583be9b24bee039e6b7f35e3727b8de.zip
newlib-2f47bbd55583be9b24bee039e6b7f35e3727b8de.tar.gz
newlib-2f47bbd55583be9b24bee039e6b7f35e3727b8de.tar.bz2
* DevNotes: Add entry cgf-000021.
* select.cc (select): Unconditionally return when a signal is detected. (select_stuff::wait): Ditto.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/DevNotes9
-rw-r--r--winsup/cygwin/globals.cc2
-rw-r--r--winsup/cygwin/select.cc28
4 files changed, 29 insertions, 16 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 32d87e0..57a8216 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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
diff --git a/winsup/cygwin/DevNotes b/winsup/cygwin/DevNotes
index 0884579..cff8a27 100644
--- a/winsup/cygwin/DevNotes
+++ b/winsup/cygwin/DevNotes
@@ -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)
diff --git a/winsup/cygwin/globals.cc b/winsup/cygwin/globals.cc
index 19a65b1..581aecb 100644
--- a/winsup/cygwin/globals.cc
+++ b/winsup/cygwin/globals.cc
@@ -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.
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index 143e8c4..4286c15 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -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");