diff options
Diffstat (limited to 'test/fixedbugs/issue11256.go')
-rw-r--r-- | test/fixedbugs/issue11256.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/test/fixedbugs/issue11256.go b/test/fixedbugs/issue11256.go new file mode 100644 index 0000000..69fc3e8 --- /dev/null +++ b/test/fixedbugs/issue11256.go @@ -0,0 +1,53 @@ +// run + +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that stack barriers are reset when a goroutine exits without +// returning. + +package main + +import ( + "runtime" + "sync/atomic" + "time" +) + +func main() { + // Let the garbage collector run concurrently. + runtime.GOMAXPROCS(2) + + var x [100][]byte + + for i := range x { + var done int32 + + go func() { + // Use enough stack to get stack barriers, but + // not so much that we go over _FixedStack. + // There's a very narrow window here on most + // OSs, so we basically can't do anything (not + // even a time.Sleep or a channel). + var buf [1024]byte + buf[0]++ + for atomic.LoadInt32(&done) == 0 { + runtime.Gosched() + } + atomic.StoreInt32(&done, 0) + // Exit without unwinding stack barriers. + runtime.Goexit() + }() + + // Generate some garbage. + x[i] = make([]byte, 1024*1024) + + // Give GC some time to install stack barriers in the G. + time.Sleep(50 * time.Microsecond) + atomic.StoreInt32(&done, 1) + for atomic.LoadInt32(&done) == 1 { + runtime.Gosched() + } + } +} |