* exceptions.cc (sigdelayed): Move declaration to sigproc.h.

* sigproc.h (sigdelayed): Make symbol globally available.
* gendef (sigdelayed): Specifically zero incyg and stacklock.
* signal.cc (sigwaitinfo): Lock _my_tls and try harder to clean up signal
information.
This commit is contained in:
Christopher Faylor 2012-08-15 16:35:00 +00:00
parent 0123506d2d
commit d57a4725b1
5 changed files with 18 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2012-08-15 Christopher Faylor <me.cygwin2012@cgf.cx>
* exceptions.cc (sigdelayed): Move declaration to sigproc.h.
* sigproc.h (sigdelayed): Make symbol globally available.
* gendef (sigdelayed): Specifically zero incyg and stacklock.
* signal.cc (sigwaitinfo): Lock _my_tls and try harder to clean up
signal information.
2012-08-15 Christopher Faylor <me.cygwin2012@cgf.cx>
* pinfo.cc (_pinfo::exists): Don't consider an execed process to exist.

View File

@ -37,8 +37,6 @@ details. */
char debugger_command[2 * NT_MAX_PATH + 20];
extern "C" void sigdelayed ();
static BOOL WINAPI ctrl_c_handler (DWORD);
/* This is set to indicate that we have already exited. */

View File

@ -196,8 +196,9 @@ _sigdelayed:
xorl %ebp,%ebp
xchgl %ebp,-4(%eax) # get return address from signal stack
xchgl %ebp,28(%esp) # store real return address
leave: decl $tls::incyg(%ebx)
decl $tls::stacklock(%ebx) # unlock
leave: xorl %eax,%eax
movl %eax,$tls::incyg(%ebx)
movl %eax,$tls::stacklock(%ebx) # unlock
popl %eax
popl %ebx

View File

@ -590,10 +590,14 @@ sigwaitinfo (const sigset_t *set, siginfo_t *info)
}
else
{
_my_tls.lock ();
if (info)
*info = _my_tls.infodata;
res = _my_tls.infodata.si_signo;
InterlockedExchange ((LONG *) &_my_tls.sig, (LONG) 0);
_my_tls.sig = 0;
if (_my_tls.retaddr () == (__stack_t) sigdelayed)
_my_tls.pop ();
_my_tls.unlock ();
}
break;
default:

View File

@ -86,6 +86,8 @@ void __stdcall sigalloc ();
int kill_pgrp (pid_t, siginfo_t&);
int killsys (pid_t, int);
extern "C" void sigdelayed ();
extern char myself_nowait_dummy[];
extern struct sigaction *global_sigs;