blob: 69fc3e8d84223f079b653fd555c4cc229ca003eb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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()
}
}
}
|