1// buildrun -t 10  -gcflags=-d=ssa/insert_resched_checks/on,ssa/check/on
2
3//go:build !nacl && !js && disabled_see_issue_18589
4
5// Copyright 2016 The Go Authors. All rights reserved.
6// Use of this source code is governed by a BSD-style
7// license that can be found in the LICENSE file.
8
9// Test is disabled because it flakes when run in all.bash
10// on some platforms, but is useful standalone to verify
11// that rescheduling checks are working (and we may wish
12// to investigate the flake, since it suggests that the
13// loop rescheduling check may not work right on those
14// platforms).
15
16// This checks to see that call-free infinite loops do not
17// block garbage collection.  IF YOU RUN IT STANDALONE without
18// -gcflags=-d=ssa/insert_resched_checks/on in a not-experimental
19// build, it should hang.
20
21package main
22
23import (
24	"runtime"
25)
26
27var someglobal1 int
28var someglobal2 int
29var someglobal3 int
30
31//go:noinline
32func f() {}
33
34func standinacorner1() {
35	for someglobal1&1 == 0 {
36		someglobal1++
37		someglobal1++
38	}
39}
40
41func standinacorner2(i int) {
42	// contains an irreducible loop containing changes to memory
43	if i != 0 {
44		goto midloop
45	}
46
47loop:
48	if someglobal2&1 != 0 {
49		goto done
50	}
51	someglobal2++
52midloop:
53	someglobal2++
54	goto loop
55
56done:
57	return
58}
59
60func standinacorner3() {
61	for someglobal3&1 == 0 {
62		if someglobal3&2 != 0 {
63			for someglobal3&3 == 2 {
64				someglobal3++
65				someglobal3++
66				someglobal3++
67				someglobal3++
68			}
69		}
70		someglobal3++
71		someglobal3++
72		someglobal3++
73		someglobal3++
74	}
75}
76
77func main() {
78	go standinacorner1()
79	go standinacorner2(0)
80	go standinacorner3()
81	// println("About to stand in a corner1")
82	for someglobal1 == 0 {
83		runtime.Gosched()
84	}
85	// println("About to stand in a corner2")
86	for someglobal2 == 0 {
87		runtime.Gosched()
88	}
89	// println("About to stand in a corner3")
90	for someglobal3 == 0 {
91		runtime.Gosched()
92	}
93	// println("About to GC")
94	runtime.GC()
95	// println("Success")
96}
97