* 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:
parent
0123506d2d
commit
d57a4725b1
@ -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>
|
2012-08-15 Christopher Faylor <me.cygwin2012@cgf.cx>
|
||||||
|
|
||||||
* pinfo.cc (_pinfo::exists): Don't consider an execed process to exist.
|
* pinfo.cc (_pinfo::exists): Don't consider an execed process to exist.
|
||||||
|
@ -37,8 +37,6 @@ details. */
|
|||||||
|
|
||||||
char debugger_command[2 * NT_MAX_PATH + 20];
|
char debugger_command[2 * NT_MAX_PATH + 20];
|
||||||
|
|
||||||
extern "C" void sigdelayed ();
|
|
||||||
|
|
||||||
static BOOL WINAPI ctrl_c_handler (DWORD);
|
static BOOL WINAPI ctrl_c_handler (DWORD);
|
||||||
|
|
||||||
/* This is set to indicate that we have already exited. */
|
/* This is set to indicate that we have already exited. */
|
||||||
|
@ -196,8 +196,9 @@ _sigdelayed:
|
|||||||
xorl %ebp,%ebp
|
xorl %ebp,%ebp
|
||||||
xchgl %ebp,-4(%eax) # get return address from signal stack
|
xchgl %ebp,-4(%eax) # get return address from signal stack
|
||||||
xchgl %ebp,28(%esp) # store real return address
|
xchgl %ebp,28(%esp) # store real return address
|
||||||
leave: decl $tls::incyg(%ebx)
|
leave: xorl %eax,%eax
|
||||||
decl $tls::stacklock(%ebx) # unlock
|
movl %eax,$tls::incyg(%ebx)
|
||||||
|
movl %eax,$tls::stacklock(%ebx) # unlock
|
||||||
|
|
||||||
popl %eax
|
popl %eax
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
@ -590,10 +590,14 @@ sigwaitinfo (const sigset_t *set, siginfo_t *info)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
_my_tls.lock ();
|
||||||
if (info)
|
if (info)
|
||||||
*info = _my_tls.infodata;
|
*info = _my_tls.infodata;
|
||||||
res = _my_tls.infodata.si_signo;
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -86,6 +86,8 @@ void __stdcall sigalloc ();
|
|||||||
int kill_pgrp (pid_t, siginfo_t&);
|
int kill_pgrp (pid_t, siginfo_t&);
|
||||||
int killsys (pid_t, int);
|
int killsys (pid_t, int);
|
||||||
|
|
||||||
|
extern "C" void sigdelayed ();
|
||||||
|
|
||||||
extern char myself_nowait_dummy[];
|
extern char myself_nowait_dummy[];
|
||||||
|
|
||||||
extern struct sigaction *global_sigs;
|
extern struct sigaction *global_sigs;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user