* exceptions.cc (sigpacket::process): Move signal_exit processing into...
(_cygtls::signal_exit): ...here. Close my_readsig and comment on why. * pinfo.cc (pinfo::exit): Move sigproc_terminate earlier. Set exiting flag in lock_process. * sigproc.cc (my_readsig): Make global. * sync.cc (muto::exiting_thread): Delete. (muto::acquire): Delete #if 0'ed code. * sync.h (muto::exiting_thread): Delete. (set_exiting_thread): Ditto. (lock_process::lock_process): Don't worry about setting the exiting thread since it had no meaning.
This commit is contained in:
parent
505bce274f
commit
1d04c4c6c3
|
@ -1,3 +1,17 @@
|
||||||
|
2011-11-25 Christopher Faylor <me.cygwin2011@cgf.cx>
|
||||||
|
|
||||||
|
* exceptions.cc (sigpacket::process): Move additional processing into...
|
||||||
|
(_cygtls::signal_exit): ...here. Close my_readsig and comment on why.
|
||||||
|
* pinfo.cc (pinfo::exit): Move sigproc_terminate earlier. Set exiting
|
||||||
|
flag in lock_process.
|
||||||
|
* sigproc.cc (my_readsig): Make global.
|
||||||
|
* sync.cc (muto::exiting_thread): Delete.
|
||||||
|
(muto::acquire): Delete #if 0'ed code.
|
||||||
|
* sync.h (muto::exiting_thread): Delete.
|
||||||
|
(set_exiting_thread): Ditto.
|
||||||
|
(lock_process::lock_process): Don't worry about setting the exiting
|
||||||
|
thread since it had no meaning.
|
||||||
|
|
||||||
2011-11-24 Christopher Faylor <me.cygwin2011@cgf.cx>
|
2011-11-24 Christopher Faylor <me.cygwin2011@cgf.cx>
|
||||||
|
|
||||||
* cygthread.cc (cygthread::name): Default name to "main" if we are early
|
* cygthread.cc (cygthread::name): Default name to "main" if we are early
|
||||||
|
|
|
@ -1307,17 +1307,6 @@ thread_specific:
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
exit_sig:
|
exit_sig:
|
||||||
if (si.si_signo == SIGQUIT || si.si_signo == SIGABRT)
|
|
||||||
{
|
|
||||||
CONTEXT c;
|
|
||||||
c.ContextFlags = CONTEXT_FULL;
|
|
||||||
GetThreadContext (hMainThread, &c);
|
|
||||||
use_tls->copy_context (&c);
|
|
||||||
if (cygheap->rlim_core > 0UL)
|
|
||||||
si.si_signo |= 0x80;
|
|
||||||
}
|
|
||||||
SetEvent (signal_arrived); // To avoid a potential deadlock with proc_lock
|
|
||||||
sigproc_printf ("signal %d, about to call do_exit", si.si_signo);
|
|
||||||
use_tls->signal_exit (si.si_signo); /* never returns */
|
use_tls->signal_exit (si.si_signo); /* never returns */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1327,6 +1316,20 @@ exit_sig:
|
||||||
void
|
void
|
||||||
_cygtls::signal_exit (int rc)
|
_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)
|
if (have_execed)
|
||||||
{
|
{
|
||||||
sigproc_printf ("terminating captive process");
|
sigproc_printf ("terminating captive process");
|
||||||
|
|
|
@ -181,7 +181,8 @@ void
|
||||||
pinfo::exit (DWORD n)
|
pinfo::exit (DWORD n)
|
||||||
{
|
{
|
||||||
minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n);
|
minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n);
|
||||||
lock_process until_exit ();
|
sigproc_terminate (ES_FINAL);
|
||||||
|
lock_process until_exit (true);
|
||||||
cygthread::terminate ();
|
cygthread::terminate ();
|
||||||
|
|
||||||
if (n != EXITCODE_NOSET)
|
if (n != EXITCODE_NOSET)
|
||||||
|
@ -192,7 +193,6 @@ pinfo::exit (DWORD n)
|
||||||
maybe_set_exit_code_from_windows ();
|
maybe_set_exit_code_from_windows ();
|
||||||
}
|
}
|
||||||
|
|
||||||
sigproc_terminate (ES_FINAL);
|
|
||||||
if (myself->ctty > 0 && !iscons_dev (myself->ctty))
|
if (myself->ctty > 0 && !iscons_dev (myself->ctty))
|
||||||
{
|
{
|
||||||
lock_ttys here;
|
lock_ttys here;
|
||||||
|
|
|
@ -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;
|
||||||
Static HANDLE my_readsig;
|
HANDLE NO_COPY my_readsig;
|
||||||
|
|
||||||
/* Function declarations */
|
/* Function declarations */
|
||||||
static int __stdcall checkstate (waitq *) __attribute__ ((regparm (1)));
|
static int __stdcall checkstate (waitq *) __attribute__ ((regparm (1)));
|
||||||
|
|
|
@ -20,7 +20,6 @@ details. */
|
||||||
|
|
||||||
#undef WaitForSingleObject
|
#undef WaitForSingleObject
|
||||||
|
|
||||||
DWORD NO_COPY muto::exiting_thread;
|
|
||||||
muto NO_COPY lock_process::locker;
|
muto NO_COPY lock_process::locker;
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -76,10 +75,6 @@ int
|
||||||
muto::acquire (DWORD ms)
|
muto::acquire (DWORD ms)
|
||||||
{
|
{
|
||||||
void *this_tls = &_my_tls;
|
void *this_tls = &_my_tls;
|
||||||
#if 0
|
|
||||||
if (exiting_thread)
|
|
||||||
return this_tid == exiting_thread;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (tls != this_tls)
|
if (tls != this_tls)
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,7 +17,6 @@ class muto
|
||||||
public:
|
public:
|
||||||
const char *name;
|
const char *name;
|
||||||
private:
|
private:
|
||||||
static DWORD exiting_thread;
|
|
||||||
LONG sync; /* Used to serialize access to this class. */
|
LONG sync; /* Used to serialize access to this class. */
|
||||||
LONG waiters; /* Number of threads waiting for lock. */
|
LONG waiters; /* Number of threads waiting for lock. */
|
||||||
HANDLE bruteforce; /* event handle used to control waiting for lock. */
|
HANDLE bruteforce; /* event handle used to control waiting for lock. */
|
||||||
|
@ -39,7 +38,6 @@ public:
|
||||||
void upforgrabs () {tls = this;} // just set to an invalid address
|
void upforgrabs () {tls = this;} // just set to an invalid address
|
||||||
void grab () __attribute__ ((regparm (1)));
|
void grab () __attribute__ ((regparm (1)));
|
||||||
operator int () const {return !!name;}
|
operator int () const {return !!name;}
|
||||||
static void set_exiting_thread () {exiting_thread = GetCurrentThreadId ();}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class lock_process
|
class lock_process
|
||||||
|
@ -54,10 +52,7 @@ public:
|
||||||
locker.acquire ();
|
locker.acquire ();
|
||||||
skip_unlock = exiting;
|
skip_unlock = exiting;
|
||||||
if (exiting && exit_state < ES_PROCESS_LOCKED)
|
if (exiting && exit_state < ES_PROCESS_LOCKED)
|
||||||
{
|
exit_state = ES_PROCESS_LOCKED;
|
||||||
exit_state = ES_PROCESS_LOCKED;
|
|
||||||
muto::set_exiting_thread ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
~lock_process ()
|
~lock_process ()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue