* 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:
		| @@ -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> | ||||
|  | ||||
| 	* cygthread.cc (cygthread::name): Default name to "main" if we are early | ||||
|   | ||||
| @@ -1307,17 +1307,6 @@ thread_specific: | ||||
|   goto done; | ||||
|  | ||||
| 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 */ | ||||
| } | ||||
|  | ||||
| @@ -1327,6 +1316,20 @@ exit_sig: | ||||
| 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"); | ||||
|   | ||||
| @@ -181,7 +181,8 @@ void | ||||
| pinfo::exit (DWORD n) | ||||
| { | ||||
|   minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n); | ||||
|   lock_process until_exit (); | ||||
|   sigproc_terminate (ES_FINAL); | ||||
|   lock_process until_exit (true); | ||||
|   cygthread::terminate (); | ||||
|  | ||||
|   if (n != EXITCODE_NOSET) | ||||
| @@ -192,7 +193,6 @@ pinfo::exit (DWORD n) | ||||
|       maybe_set_exit_code_from_windows (); | ||||
|     } | ||||
|  | ||||
|   sigproc_terminate (ES_FINAL); | ||||
|   if (myself->ctty > 0 && !iscons_dev (myself->ctty)) | ||||
|     { | ||||
|       lock_ttys here; | ||||
|   | ||||
| @@ -64,7 +64,7 @@ Static muto sync_proc_subproc;	// Control access to subproc stuff | ||||
| _cygtls NO_COPY *_sig_tls; | ||||
|  | ||||
| Static HANDLE my_sendsig; | ||||
| Static HANDLE my_readsig; | ||||
| HANDLE NO_COPY my_readsig; | ||||
|  | ||||
| /* Function declarations */ | ||||
| static int __stdcall checkstate (waitq *) __attribute__ ((regparm (1))); | ||||
|   | ||||
| @@ -20,7 +20,6 @@ details. */ | ||||
|  | ||||
| #undef WaitForSingleObject | ||||
|  | ||||
| DWORD NO_COPY muto::exiting_thread; | ||||
| muto NO_COPY lock_process::locker; | ||||
|  | ||||
| void | ||||
| @@ -76,10 +75,6 @@ int | ||||
| muto::acquire (DWORD ms) | ||||
| { | ||||
|   void *this_tls = &_my_tls; | ||||
| #if 0 | ||||
|   if (exiting_thread) | ||||
|     return this_tid == exiting_thread; | ||||
| #endif | ||||
|  | ||||
|   if (tls != this_tls) | ||||
|     { | ||||
|   | ||||
| @@ -17,7 +17,6 @@ class muto | ||||
| public: | ||||
|   const char *name; | ||||
| private: | ||||
|   static DWORD exiting_thread; | ||||
|   LONG sync;	/* Used to serialize access to this class. */ | ||||
|   LONG waiters;	/* Number of threads 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 grab () __attribute__ ((regparm (1))); | ||||
|   operator int () const {return !!name;} | ||||
|   static void set_exiting_thread () {exiting_thread = GetCurrentThreadId ();} | ||||
| }; | ||||
|  | ||||
| class lock_process | ||||
| @@ -54,10 +52,7 @@ public: | ||||
|     locker.acquire (); | ||||
|     skip_unlock = exiting; | ||||
|     if (exiting && exit_state < ES_PROCESS_LOCKED) | ||||
|       { | ||||
| 	exit_state = ES_PROCESS_LOCKED; | ||||
| 	muto::set_exiting_thread (); | ||||
|       } | ||||
|       exit_state = ES_PROCESS_LOCKED; | ||||
|   } | ||||
|   ~lock_process () | ||||
|   { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user