| // Copyright 2015 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. | 
 |  | 
 | // The file contains tests that cannot run under race detector for some reason. | 
 | // +build !race | 
 |  | 
 | package runtime_test | 
 |  | 
 | import ( | 
 | 	"runtime" | 
 | 	"testing" | 
 | 	"time" | 
 | 	"unsafe" | 
 | ) | 
 |  | 
 | var newOSProcDone bool | 
 |  | 
 | //go:nosplit | 
 | func newOSProcCreated() { | 
 | 	newOSProcDone = true | 
 | } | 
 |  | 
 | // Can't be run with -race because it inserts calls into newOSProcCreated() | 
 | // that require a valid G/M. | 
 | func TestNewOSProc0(t *testing.T) { | 
 | 	runtime.NewOSProc0(0x800000, unsafe.Pointer(runtime.FuncPC(newOSProcCreated))) | 
 | 	check := time.NewTicker(100 * time.Millisecond) | 
 | 	defer check.Stop() | 
 | 	end := time.After(5 * time.Second) | 
 | 	for { | 
 | 		select { | 
 | 		case <-check.C: | 
 | 			if newOSProcDone { | 
 | 				return | 
 | 			} | 
 | 		case <-end: | 
 | 			t.Fatalf("couldn't create new OS process") | 
 | 		} | 
 | 	} | 
 | } |