aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/crash_test.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2017-04-19 07:32:34 -0700
committerIan Lance Taylor <iant@golang.org>2017-06-05 22:42:48 +0000
commit2d86f4942868c1309051062237cf4d424d588e9c (patch)
tree83daa9155317bed206497703c0132b1bfc4a0265 /src/runtime/crash_test.go
parent3c745d750e8342b1dd4144a83488b559efb8b271 (diff)
downloadgo-2d86f4942868c1309051062237cf4d424d588e9c.tar.gz
go-2d86f4942868c1309051062237cf4d424d588e9c.zip
runtime: delay exiting while panic is running deferred functions
Try to avoid a race between the main goroutine exiting and a panic occurring. Don't try too hard, to avoid hanging. Updates #3934 Fixes #20018 Change-Id: I57a02b6d795d2a61f1cadd137ce097145280ece7 Reviewed-on: https://go-review.googlesource.com/41052 Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/crash_test.go')
-rw-r--r--src/runtime/crash_test.go29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go
index f6a0cd6cbb..b08dd87d9b 100644
--- a/src/runtime/crash_test.go
+++ b/src/runtime/crash_test.go
@@ -568,3 +568,32 @@ func TestPanicInlined(t *testing.T) {
pt := new(point)
pt.negate()
}
+
+// Test for issues #3934 and #20018.
+// We want to delay exiting until a panic print is complete.
+func TestPanicRace(t *testing.T) {
+ testenv.MustHaveGoRun(t)
+
+ exe, err := buildTestProg(t, "testprog")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ got, err := testEnv(exec.Command(exe, "PanicRace")).CombinedOutput()
+ if err == nil {
+ t.Error("program exited successfully, should have failed")
+ }
+
+ t.Logf("%s\n", got)
+
+ wants := []string{
+ "panic: crash",
+ "PanicRace",
+ "created by ",
+ }
+ for _, want := range wants {
+ if !bytes.Contains(got, []byte(want)) {
+ t.Errorf("did not find expected string %q", want)
+ }
+ }
+}