diff options
-rw-r--r-- | winsup/cygwin/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/select.cc | 14 |
2 files changed, 16 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 56e644394..d1811dc63 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2012-05-25 Corinna Vinschen <corinna@vinschen.de> + * select.cc (select_stuff::wait): When not returning after receiving + a signal, recalculate timeout. Apply temporary fix to avoid crashes + after calling the signal handler. Explain. + +2012-05-25 Corinna Vinschen <corinna@vinschen.de> + * fhandler_serial.cc (fhandler_serial::raw_read): Check for ERROR_OPERATION_ABORTED rather than ERROR_IO_INCOMPLETE after CancelIo. diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 85753e817..c8d7ddb05 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -310,6 +310,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, continue; } + bool gotone; LONGLONG start_time = gtod.msecs (); /* Record the current time for later use. */ debug_printf ("m %d, ms %u", m, ms); @@ -330,10 +331,15 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, { case WAIT_OBJECT_0: select_printf ("signal received"); - _my_tls.call_signal_handler (); + /* FIXME? Partial revert of change from 2012-01-22. If the signal + handler is called before the threads are stopped via cleanup, + emacs 24.x crashes in thread_pipe. For now, do not call the + signal handler if we're not in the main thread, but cleanup + before calling the signal handler. */ if (!return_on_signal) - continue; /* Emulate linux behavior */ + goto looping; /* Emulate linux behavior */ cleanup (); + _my_tls.call_signal_handler (); set_sig_errno (EINTR); return -1; case WAIT_OBJECT_0 + 1: @@ -361,7 +367,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, select_printf ("woke up. wait_ret %d. verifying", wait_ret); s = &start; - bool gotone = false; + gotone = false; /* Some types of objects (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 @@ -383,7 +389,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, cleanup (); goto out; } - +looping: if (ms == INFINITE) { select_printf ("looping"); |