]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: sleep a bit to let a bad signal be delivered
authorIan Lance Taylor <iant@golang.org>
Wed, 16 Nov 2016 05:15:40 +0000 (21:15 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 22 Nov 2016 04:28:59 +0000 (04:28 +0000)
When we raise a signal that was delivered to C code, it's possible that
the kernel will not deliver it immediately. This is especially possible
on Darwin where we use send the signal to the entire process rather than
just the current thread. Sleep for a millisecond after sending the
signal to give it a chance to be delivered before we restore the Go
signal handler. In most real cases the program is going to crash at this
point, so sleeping is kind of irrelevant anyhow.

Fixes #14809.

Change-Id: Ib2c0d2c4e240977fb4535dc1dd2bdc50d430eb85
Reviewed-on: https://go-review.googlesource.com/33300
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/runtime/signal_unix.go

index 8b932341a93e22bc853d880a84adfc282ec6e2ee..78381e58d7ad86f51ad659accef06d35019d2b0b 100644 (file)
@@ -354,6 +354,11 @@ func raisebadsignal(sig uint32, c *sigctxt) {
 
        raise(sig)
 
+       // Give the signal a chance to be delivered.
+       // In almost all real cases the program is about to crash,
+       // so sleeping here is not a waste of time.
+       usleep(1000)
+
        // If the signal didn't cause the program to exit, restore the
        // Go signal handler and carry on.
        //