* exceptions.cc (stackdump): Make global.
(signal_exit): Move to sigproc.cc. * sigproc.cc (signal_exit): Move here. Declare stackdump extern. Set my_sendsig to indicate that signals are no longer available. (my_readsig): Make Static again. (sig_send): Interpret ERROR_BROKEN_PIPE as ESRCH. Remove special-case EACCESS errno setting, just setting errno generally, even for "its_me" case.
This commit is contained in:
parent
1d04c4c6c3
commit
4ab568c60c
|
@ -1,6 +1,18 @@
|
||||||
|
2011-11-26 Christopher Faylor <me.cygwin2011@cgf.cx>
|
||||||
|
|
||||||
|
* exceptions.cc (stackdump): Make global.
|
||||||
|
(signal_exit): Move to sigproc.cc.
|
||||||
|
* sigproc.cc (signal_exit): Move here. Declare stackdump extern. Set
|
||||||
|
my_sendsig to indicate that signals are no longer available.
|
||||||
|
(my_readsig): Make Static again.
|
||||||
|
(sig_send): Interpret ERROR_BROKEN_PIPE as ESRCH. Remove special-case
|
||||||
|
EACCESS errno setting, just setting errno generally, even for "its_me"
|
||||||
|
case.
|
||||||
|
|
||||||
2011-11-25 Christopher Faylor <me.cygwin2011@cgf.cx>
|
2011-11-25 Christopher Faylor <me.cygwin2011@cgf.cx>
|
||||||
|
|
||||||
* exceptions.cc (sigpacket::process): Move additional processing into...
|
* exceptions.cc (sigpacket::process): Move signal_exit processing
|
||||||
|
into...
|
||||||
(_cygtls::signal_exit): ...here. Close my_readsig and comment on why.
|
(_cygtls::signal_exit): ...here. Close my_readsig and comment on why.
|
||||||
* pinfo.cc (pinfo::exit): Move sigproc_terminate earlier. Set exiting
|
* pinfo.cc (pinfo::exit): Move sigproc_terminate earlier. Set exiting
|
||||||
flag in lock_process.
|
flag in lock_process.
|
||||||
|
|
|
@ -279,7 +279,7 @@ stack_info::walk ()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
stackdump (DWORD ebp, int open_file, bool isexception)
|
stackdump (DWORD ebp, int open_file, bool isexception)
|
||||||
{
|
{
|
||||||
static bool already_dumped;
|
static bool already_dumped;
|
||||||
|
@ -1310,48 +1310,6 @@ exit_sig:
|
||||||
use_tls->signal_exit (si.si_signo); /* never returns */
|
use_tls->signal_exit (si.si_signo); /* never returns */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cover function to `do_exit' to handle exiting even in presence of more
|
|
||||||
exceptions. We used to call exit, but a SIGSEGV shouldn't cause atexit
|
|
||||||
routines to run. */
|
|
||||||
void
|
|
||||||
_cygtls::signal_exit (int rc)
|
|
||||||
{
|
|
||||||
extern HANDLE my_readsig;
|
|
||||||
ForceCloseHandle (my_readsig); /* Disallow further signal sends */
|
|
||||||
SetEvent (signal_arrived); /* Avoid potential deadlock with proc_lock */
|
|
||||||
|
|
||||||
if (rc == SIGQUIT || rc == SIGABRT)
|
|
||||||
{
|
|
||||||
CONTEXT c;
|
|
||||||
c.ContextFlags = CONTEXT_FULL;
|
|
||||||
GetThreadContext (hMainThread, &c);
|
|
||||||
copy_context (&c);
|
|
||||||
if (cygheap->rlim_core > 0UL)
|
|
||||||
rc |= 0x80;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (have_execed)
|
|
||||||
{
|
|
||||||
sigproc_printf ("terminating captive process");
|
|
||||||
TerminateProcess (ch_spawn, sigExeced = rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
signal_debugger (rc & 0x7f);
|
|
||||||
if ((rc & 0x80) && !try_to_debug ())
|
|
||||||
stackdump (thread_context.ebp, 1, 1);
|
|
||||||
|
|
||||||
lock_process until_exit (true);
|
|
||||||
if (have_execed || exit_state > ES_PROCESS_LOCKED)
|
|
||||||
myself.exit (rc);
|
|
||||||
|
|
||||||
/* Starve other threads in a vain attempt to stop them from doing something
|
|
||||||
stupid. */
|
|
||||||
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
|
|
||||||
|
|
||||||
sigproc_printf ("about to call do_exit (%x)", rc);
|
|
||||||
do_exit (rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
events_init ()
|
events_init ()
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,7 +64,7 @@ Static muto sync_proc_subproc; // Control access to subproc stuff
|
||||||
_cygtls NO_COPY *_sig_tls;
|
_cygtls NO_COPY *_sig_tls;
|
||||||
|
|
||||||
Static HANDLE my_sendsig;
|
Static HANDLE my_sendsig;
|
||||||
HANDLE NO_COPY my_readsig;
|
Static HANDLE my_readsig;
|
||||||
|
|
||||||
/* Function declarations */
|
/* Function declarations */
|
||||||
static int __stdcall checkstate (waitq *) __attribute__ ((regparm (1)));
|
static int __stdcall checkstate (waitq *) __attribute__ ((regparm (1)));
|
||||||
|
@ -365,6 +365,50 @@ _cygtls::remove_wq (DWORD wait)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Cover function to `do_exit' to handle exiting even in presence of more
|
||||||
|
exceptions. We used to call exit, but a SIGSEGV shouldn't cause atexit
|
||||||
|
routines to run. */
|
||||||
|
void
|
||||||
|
_cygtls::signal_exit (int rc)
|
||||||
|
{
|
||||||
|
extern void stackdump (DWORD, int, bool);
|
||||||
|
|
||||||
|
my_sendsig = NULL; /* Make no_signals_allowed return true */
|
||||||
|
ForceCloseHandle (my_readsig); /* Stop any currently executing sig_sends */
|
||||||
|
SetEvent (signal_arrived); /* Avoid potential deadlock with proc_lock */
|
||||||
|
|
||||||
|
if (rc == SIGQUIT || rc == SIGABRT)
|
||||||
|
{
|
||||||
|
CONTEXT c;
|
||||||
|
c.ContextFlags = CONTEXT_FULL;
|
||||||
|
GetThreadContext (hMainThread, &c);
|
||||||
|
copy_context (&c);
|
||||||
|
if (cygheap->rlim_core > 0UL)
|
||||||
|
rc |= 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (have_execed)
|
||||||
|
{
|
||||||
|
sigproc_printf ("terminating captive process");
|
||||||
|
TerminateProcess (ch_spawn, sigExeced = rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
signal_debugger (rc & 0x7f);
|
||||||
|
if ((rc & 0x80) && !try_to_debug ())
|
||||||
|
stackdump (thread_context.ebp, 1, 1);
|
||||||
|
|
||||||
|
lock_process until_exit (true);
|
||||||
|
if (have_execed || exit_state > ES_PROCESS_LOCKED)
|
||||||
|
myself.exit (rc);
|
||||||
|
|
||||||
|
/* Starve other threads in a vain attempt to stop them from doing something
|
||||||
|
stupid. */
|
||||||
|
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
|
||||||
|
|
||||||
|
sigproc_printf ("about to call do_exit (%x)", rc);
|
||||||
|
do_exit (rc);
|
||||||
|
}
|
||||||
|
|
||||||
/* Terminate the wait_subproc thread.
|
/* Terminate the wait_subproc thread.
|
||||||
Called on process exit.
|
Called on process exit.
|
||||||
Also called by spawn_guts to disassociate any subprocesses from this
|
Also called by spawn_guts to disassociate any subprocesses from this
|
||||||
|
@ -682,7 +726,6 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
|
||||||
process is exiting. */
|
process is exiting. */
|
||||||
if (!its_me)
|
if (!its_me)
|
||||||
{
|
{
|
||||||
__seterrno ();
|
|
||||||
sigproc_printf ("WriteFile for pipe %p failed, %E", sendsig);
|
sigproc_printf ("WriteFile for pipe %p failed, %E", sendsig);
|
||||||
ForceCloseHandle (sendsig);
|
ForceCloseHandle (sendsig);
|
||||||
}
|
}
|
||||||
|
@ -693,8 +736,11 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls)
|
||||||
else if (!p->exec_sendsig)
|
else if (!p->exec_sendsig)
|
||||||
system_printf ("error sending signal %d to pid %d, pipe handle %p, %E",
|
system_printf ("error sending signal %d to pid %d, pipe handle %p, %E",
|
||||||
si.si_signo, p->pid, sendsig);
|
si.si_signo, p->pid, sendsig);
|
||||||
set_errno (EACCES);
|
|
||||||
}
|
}
|
||||||
|
if (GetLastError () == ERROR_BROKEN_PIPE)
|
||||||
|
set_errno (ESRCH);
|
||||||
|
else
|
||||||
|
__seterrno ();
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue