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