* cygtls.cc (_cygtls::reset_signal_arrived): New function.

(set_signal_arrived::~set_signal_arrived): Use reset_signal_arrived to reset
state.
* exceptions.cc (sig_handle_tty_stop): Use WAIT_SIGNALED rather than assume we
know the return from cancelable_wait.
(_cygtls::interrupt_setup): Modify to allow calling when executing in
non-cygwin code via sigdelayed.  Always reset signal_arrived.
* gendef: Throughout use start_offset rather than the completely wrong
sizeof__cygtls.
(_sigdelayed): Rewrite to avoid duplication when calling the signal handler.
(sigreturn): Delete.
* gentls_offsets: Define start_offset rather than sizeof__cygtls.
* tlsoffsets.h: Regenerate.
This commit is contained in:
Christopher Faylor
2012-07-29 21:43:29 +00:00
parent ab6596266f
commit dd06381996
5 changed files with 45 additions and 62 deletions

View File

@@ -162,60 +162,23 @@ __sigbe: # return here after cygwin syscall
.global _sigdelayed
_sigdelayed:
pushl %ebp
movl %esp,%ebp
pushl %ebp
movl %esp,%ebp
pushf
pushl %esi
pushl %edi
pushl %edx
pushl %ecx
pushl %ebx
pushl %eax
movl %fs:4,%ebx
1: movl \$1,%eax
xchgl %eax,$tls::stacklock(%ebx)
movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock
# If %eax is 1 then someone else has
# the lock but we want to flag that
# we're waiting for it. If %eax is 0
# then we're not spinning and 0 will
# reflect that.
testl %eax,%eax
jz 2f
call _yield
jmp 1b
2: incl $tls::incyg(%ebx)
movl $tls::sig(%ebx),%eax
testl %eax,%eax
jz leave # call_signal_handler may have beat us
# to it
pushl $tls::saved_errno(%ebx) # saved errno
call _set_process_mask_delta
pushl %eax
pushl %esi
pushl %edi
pushl %edx
pushl %ecx
pushl %ebx
pushl %eax
movl %fs:4,%ebx # get tls
pushl $tls::saved_errno(%ebx) # saved errno
# fill out handler arguments
xorl %eax,%eax # ucontext_t (currently not set)
pushl %eax
leal $tls::infodata(%ebx),%eax
pushl %eax # siginfo
pushl $tls::sig(%ebx) # signal number
pushl \$_sigreturn # where to return
pushl $tls::func(%ebx) # user-supplied signal func
movl \$0,$tls::sig(%ebx) # zero the signal number as a
# flag to the signal handler thread
# that it is ok to set up sigsave
4: decl $tls::incyg(%ebx)
decl $tls::stacklock(%ebx)
ret # return via signal handler
.global _sigreturn
_sigreturn:
movl %fs:4,%ebx
incl $tls::incyg(%ebx)
addl \$12,%esp # remove arguments
call _set_process_mask\@4
movl \$$tls::start_offset,%eax # point to beginning
addl %ebx,%eax # of tls block
call __ZN7_cygtls19call_signal_handlerEv # call handler
movl %fs:4,%ebx # reget tls
1: movl \$1,%eax # potential lock value
xchgl %eax,$tls::stacklock(%ebx) # see if we can grab it
movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock
@@ -292,7 +255,7 @@ stabilize_sig_stack:
cmpl \$0,$tls::sig(%ebx)
jz 3f
decl $tls::stacklock(%ebx) # unlock
movl \$-$tls::sizeof__cygtls,%eax # point to beginning
movl \$$tls::start_offset,%eax # point to beginning
addl %ebx,%eax # of tls block
call __ZN7_cygtls19call_signal_handlerEv
jmp 1b