* 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:
Christopher Faylor 2011-11-26 02:35:49 +00:00
parent 505bce274f
commit 1d04c4c6c3
6 changed files with 32 additions and 25 deletions

View File

@ -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

View File

@ -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");

View File

@ -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;

View File

@ -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)));

View File

@ -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)
{ {

View File

@ -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 ()
{ {