| // 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") | |
| } |