diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 57969024f..51e2467d0 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2013-01-21 Christopher Faylor + + * dcrt0.cc (dll_crt0_1): Comment assumption. + * exceptions.cc (sigpacket::setup_handler): Avoid sending signals + during fork processing. + 2013-01-21 Christopher Faylor * dcrt0.cc (dll_crt0_1): Flag that we are working "incyg". Handle any diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 931ebd9e8..094c0a09a 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -891,6 +891,8 @@ dll_crt0_1 (void *) _tlstop = (char *) fork_info->stacktop; } + /* Not resetting _my_tls.incyg here because presumably fork will overwrite + it with the value of the forker and all will be good. */ longjmp (fork_info->jmp, true); } diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 0a02f0d28..5a8474b6b 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -789,6 +789,10 @@ sigpacket::setup_handler (void *handler, struct sigaction& siga, _cygtls *tls) goto out; } + while (in_forkee) + yield (); /* Won't be able to send signals until we're finished + processing fork(). */ + for (int n = 0; n < CALL_HANDLER_RETRY_OUTER; n++) { for (int i = 0; i < CALL_HANDLER_RETRY_INNER; i++)