4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-03-01 12:35:44 +08:00

* 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.
This commit is contained in:
Corinna Vinschen 2012-05-25 14:33:18 +00:00
parent df5cda0e93
commit 8e599b1e3a
2 changed files with 16 additions and 4 deletions

View File

@ -1,3 +1,9 @@
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> 2012-05-25 Corinna Vinschen <corinna@vinschen.de>
* fhandler_serial.cc (fhandler_serial::raw_read): Check for * fhandler_serial.cc (fhandler_serial::raw_read): Check for

View File

@ -310,6 +310,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
continue; continue;
} }
bool gotone;
LONGLONG start_time = gtod.msecs (); /* Record the current time for later use. */ LONGLONG start_time = gtod.msecs (); /* Record the current time for later use. */
debug_printf ("m %d, ms %u", m, ms); 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: case WAIT_OBJECT_0:
select_printf ("signal received"); 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) if (!return_on_signal)
continue; /* Emulate linux behavior */ goto looping; /* Emulate linux behavior */
cleanup (); cleanup ();
_my_tls.call_signal_handler ();
set_sig_errno (EINTR); set_sig_errno (EINTR);
return -1; return -1;
case WAIT_OBJECT_0 + 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); select_printf ("woke up. wait_ret %d. verifying", wait_ret);
s = &start; s = &start;
bool gotone = false; gotone = false;
/* Some types of objects (e.g., consoles) wake up on "inappropriate" events /* Some types of objects (e.g., consoles) wake up on "inappropriate" events
like mouse movements. The verify function will detect these situations. 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 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 (); cleanup ();
goto out; goto out;
} }
looping:
if (ms == INFINITE) if (ms == INFINITE)
{ {
select_printf ("looping"); select_printf ("looping");