diff options
author | Ian Lance Taylor <iant@golang.org> | 2017-04-19 07:32:34 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2017-06-05 22:42:48 +0000 |
commit | 2d86f4942868c1309051062237cf4d424d588e9c (patch) | |
tree | 83daa9155317bed206497703c0132b1bfc4a0265 /src/runtime/crash_test.go | |
parent | 3c745d750e8342b1dd4144a83488b559efb8b271 (diff) | |
download | go-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.go | 29 |
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) + } + } +} |