| // +build !nacl,!js,disabled_see_issue_18589 | 
 | // buildrun -t 10  -gcflags=-d=ssa/insert_resched_checks/on,ssa/check/on | 
 |  | 
 | // 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") | 
 | } |