// buildrun -t 10 -gcflags=-d=ssa/insert_resched_checks/on,ssa/check/on //go:build !nacl && !js && disabled_see_issue_18589 // 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. // 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). // This checks to see that call-free infinite loops do not // block garbage collection. IF YOU RUN IT STANDALONE without // -gcflags=-d=ssa/insert_resched_checks/on in a not-experimental // build, it should hang. 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") }