* exceptions.cc (sigdelayed): Move declaration to sigproc.h.
* sigproc.h (sigdelayed): Make symbol globally available. * gendef (sigdelayed): Specifically zero incyg and stacklock. * signal.cc (sigwaitinfo): Lock _my_tls and try harder to clean up signal information.
This commit is contained in:
		| @@ -1,3 +1,11 @@ | |||||||
|  | 2012-08-15  Christopher Faylor  <me.cygwin2012@cgf.cx> | ||||||
|  |  | ||||||
|  | 	* exceptions.cc (sigdelayed): Move declaration to sigproc.h. | ||||||
|  | 	* sigproc.h (sigdelayed): Make symbol globally available. | ||||||
|  | 	* gendef (sigdelayed): Specifically zero incyg and stacklock. | ||||||
|  | 	* signal.cc (sigwaitinfo): Lock _my_tls and try harder to clean up | ||||||
|  | 	signal information. | ||||||
|  |  | ||||||
| 2012-08-15  Christopher Faylor  <me.cygwin2012@cgf.cx> | 2012-08-15  Christopher Faylor  <me.cygwin2012@cgf.cx> | ||||||
|  |  | ||||||
| 	* pinfo.cc (_pinfo::exists): Don't consider an execed process to exist. | 	* pinfo.cc (_pinfo::exists): Don't consider an execed process to exist. | ||||||
|   | |||||||
| @@ -37,8 +37,6 @@ details. */ | |||||||
|  |  | ||||||
| char debugger_command[2 * NT_MAX_PATH + 20]; | char debugger_command[2 * NT_MAX_PATH + 20]; | ||||||
|  |  | ||||||
| extern "C" void sigdelayed (); |  | ||||||
|  |  | ||||||
| static BOOL WINAPI ctrl_c_handler (DWORD); | static BOOL WINAPI ctrl_c_handler (DWORD); | ||||||
|  |  | ||||||
| /* This is set to indicate that we have already exited.  */ | /* This is set to indicate that we have already exited.  */ | ||||||
|   | |||||||
| @@ -196,8 +196,9 @@ _sigdelayed: | |||||||
| 	xorl	%ebp,%ebp | 	xorl	%ebp,%ebp | ||||||
| 	xchgl	%ebp,-4(%eax)				# get return address from signal stack | 	xchgl	%ebp,-4(%eax)				# get return address from signal stack | ||||||
| 	xchgl	%ebp,28(%esp)				# store real return address | 	xchgl	%ebp,28(%esp)				# store real return address | ||||||
| leave:	decl	$tls::incyg(%ebx) | leave:	xorl	%eax,%eax | ||||||
| 	decl	$tls::stacklock(%ebx)			# unlock | 	movl	%eax,$tls::incyg(%ebx) | ||||||
|  | 	movl	%eax,$tls::stacklock(%ebx)		# unlock | ||||||
|  |  | ||||||
| 	popl	%eax | 	popl	%eax | ||||||
| 	popl	%ebx | 	popl	%ebx | ||||||
|   | |||||||
| @@ -590,10 +590,14 @@ sigwaitinfo (const sigset_t *set, siginfo_t *info) | |||||||
| 	} | 	} | ||||||
|       else |       else | ||||||
| 	{ | 	{ | ||||||
|  | 	  _my_tls.lock (); | ||||||
| 	  if (info) | 	  if (info) | ||||||
| 	    *info = _my_tls.infodata; | 	    *info = _my_tls.infodata; | ||||||
| 	  res = _my_tls.infodata.si_signo; | 	  res = _my_tls.infodata.si_signo; | ||||||
| 	  InterlockedExchange ((LONG *) &_my_tls.sig, (LONG) 0); | 	  _my_tls.sig = 0; | ||||||
|  | 	  if (_my_tls.retaddr () == (__stack_t) sigdelayed) | ||||||
|  | 	    _my_tls.pop (); | ||||||
|  | 	  _my_tls.unlock (); | ||||||
| 	} | 	} | ||||||
|       break; |       break; | ||||||
|     default: |     default: | ||||||
|   | |||||||
| @@ -86,6 +86,8 @@ void __stdcall sigalloc (); | |||||||
| int kill_pgrp (pid_t, siginfo_t&); | int kill_pgrp (pid_t, siginfo_t&); | ||||||
| int killsys (pid_t, int); | int killsys (pid_t, int); | ||||||
|  |  | ||||||
|  | extern "C" void sigdelayed (); | ||||||
|  |  | ||||||
| extern char myself_nowait_dummy[]; | extern char myself_nowait_dummy[]; | ||||||
|  |  | ||||||
| extern struct sigaction *global_sigs; | extern struct sigaction *global_sigs; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user