2018-03-04 04:15:37 -07:00
|
|
|
// +build !nacl,!js,disabled_see_issue_18589
|
2017-01-10 06:29:34 -07:00
|
|
|
// buildrun -t 10 -gcflags=-d=ssa/insert_resched_checks/on,ssa/check/on
|
2016-11-10 14:03:47 -07:00
|
|
|
|
|
|
|
// Copyright 2016 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.
|
|
|
|
|
2017-01-10 06:29:34 -07:00
|
|
|
// Test is disabled because it flakes when run in all.bash
|
|
|
|
// on some platforms, but is useful standalone to verify
|
|
|
|
// that rescheduling checks are working (and we may wish
|
|
|
|
// to investigate the flake, since it suggests that the
|
|
|
|
// loop rescheduling check may not work right on those
|
|
|
|
// platforms).
|
|
|
|
|
2016-11-10 14:03:47 -07:00
|
|
|
// This checks to see that call-free infinite loops do not
|
2017-01-10 06:29:34 -07:00
|
|
|
// block garbage collection. IF YOU RUN IT STANDALONE without
|
|
|
|
// -gcflags=-d=ssa/insert_resched_checks/on in a not-experimental
|
|
|
|
// build, it should hang.
|
2016-11-10 14:03:47 -07:00
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"runtime"
|
|
|
|
)
|
|
|
|
|
|
|
|
var someglobal1 int
|
|
|
|
var someglobal2 int
|
|
|
|
var someglobal3 int
|
|
|
|
|
|
|
|
//go:noinline
|
|
|
|
func f() {}
|
|
|
|
|
|
|
|
func standinacorner1() {
|
|
|
|
for someglobal1&1 == 0 {
|
|
|
|
someglobal1++
|
|
|
|
someglobal1++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func standinacorner2(i int) {
|
|
|
|
// contains an irreducible loop containing changes to memory
|
|
|
|
if i != 0 {
|
|
|
|
goto midloop
|
|
|
|
}
|
|
|
|
|
|
|
|
loop:
|
|
|
|
if someglobal2&1 != 0 {
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
someglobal2++
|
|
|
|
midloop:
|
|
|
|
someglobal2++
|
|
|
|
goto loop
|
|
|
|
|
|
|
|
done:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func standinacorner3() {
|
|
|
|
for someglobal3&1 == 0 {
|
|
|
|
if someglobal3&2 != 0 {
|
|
|
|
for someglobal3&3 == 2 {
|
|
|
|
someglobal3++
|
|
|
|
someglobal3++
|
|
|
|
someglobal3++
|
|
|
|
someglobal3++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
someglobal3++
|
|
|
|
someglobal3++
|
|
|
|
someglobal3++
|
|
|
|
someglobal3++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
go standinacorner1()
|
|
|
|
go standinacorner2(0)
|
|
|
|
go standinacorner3()
|
|
|
|
// println("About to stand in a corner1")
|
|
|
|
for someglobal1 == 0 {
|
|
|
|
runtime.Gosched()
|
|
|
|
}
|
|
|
|
// println("About to stand in a corner2")
|
|
|
|
for someglobal2 == 0 {
|
|
|
|
runtime.Gosched()
|
|
|
|
}
|
|
|
|
// println("About to stand in a corner3")
|
|
|
|
for someglobal3 == 0 {
|
|
|
|
runtime.Gosched()
|
|
|
|
}
|
|
|
|
// println("About to GC")
|
|
|
|
runtime.GC()
|
|
|
|
// println("Success")
|
|
|
|
}
|