blob: 612397293fafe42601da86ff71aed0a409621aed [file] [log] [blame]
Brad Fitzpatrick51947442016-03-01 22:57:46 +00001// Copyright 2012 The Go Authors. All rights reserved.
Russ Coxdc159fa2012-03-01 11:48:17 -05002// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runtime_test
6
7import (
8 . "runtime"
9 "syscall"
10 "testing"
Brad Fitzpatrick1e3f5632017-11-21 20:46:40 +000011 "time"
Brad Fitzpatrick70418eb2016-02-11 16:36:38 +000012 "unsafe"
Russ Coxdc159fa2012-03-01 11:48:17 -050013)
14
15var pid, tid int
16
17func init() {
18 // Record pid and tid of init thread for use during test.
19 // The call to LockOSThread is just to exercise it;
20 // we can't test that it does anything.
21 // Instead we're testing that the conditions are good
22 // for how it is used in init (must be on main thread).
23 pid, tid = syscall.Getpid(), syscall.Gettid()
24 LockOSThread()
Brad Fitzpatrick1e3f5632017-11-21 20:46:40 +000025
26 sysNanosleep = func(d time.Duration) {
27 // Invoke a blocking syscall directly; calling time.Sleep()
28 // would deschedule the goroutine instead.
29 ts := syscall.NsecToTimespec(d.Nanoseconds())
30 for {
31 if err := syscall.Nanosleep(&ts, &ts); err != syscall.EINTR {
32 return
33 }
34 }
35 }
Russ Coxdc159fa2012-03-01 11:48:17 -050036}
37
38func TestLockOSThread(t *testing.T) {
39 if pid != tid {
40 t.Fatalf("pid=%d but tid=%d", pid, tid)
41 }
42}
Brad Fitzpatrick70418eb2016-02-11 16:36:38 +000043
44// Test that error values are negative. Use address 1 (a misaligned
45// pointer) to get -EINVAL.
46func TestMincoreErrorSign(t *testing.T) {
47 var dst byte
48 v := Mincore(unsafe.Pointer(uintptr(1)), 1, &dst)
49
50 const EINVAL = 0x16
51 if v != -EINVAL {
52 t.Errorf("mincore = %v, want %v", v, -EINVAL)
53 }
54}