2016-03-01 15:57:46 -07:00
|
|
|
// Copyright 2015 The Go Authors. All rights reserved.
|
2015-04-17 18:27:07 -06:00
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
2016-01-27 13:49:13 -07:00
|
|
|
// The file contains tests that cannot run under race detector for some reason.
|
2015-04-17 18:27:07 -06:00
|
|
|
// +build !race
|
|
|
|
|
|
|
|
package runtime_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"runtime"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
"unsafe"
|
|
|
|
)
|
|
|
|
|
|
|
|
var newOSProcDone bool
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
func newOSProcCreated() {
|
|
|
|
newOSProcDone = true
|
|
|
|
}
|
|
|
|
|
2015-04-22 12:44:46 -06:00
|
|
|
// Can't be run with -race because it inserts calls into newOSProcCreated()
|
|
|
|
// that require a valid G/M.
|
2015-04-17 18:27:07 -06:00
|
|
|
func TestNewOSProc0(t *testing.T) {
|
|
|
|
runtime.NewOSProc0(0x800000, unsafe.Pointer(runtime.FuncPC(newOSProcCreated)))
|
2015-04-29 00:42:43 -06:00
|
|
|
check := time.NewTicker(100 * time.Millisecond)
|
2015-04-22 12:44:46 -06:00
|
|
|
defer check.Stop()
|
|
|
|
end := time.After(5 * time.Second)
|
2015-04-17 18:27:07 -06:00
|
|
|
for {
|
|
|
|
select {
|
2015-04-22 12:44:46 -06:00
|
|
|
case <-check.C:
|
2015-04-17 18:27:07 -06:00
|
|
|
if newOSProcDone {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
case <-end:
|
|
|
|
t.Fatalf("couldn't create new OS process")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|