* 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> | 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 () | ||||||
|   { |   { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user