| // Copyright 2012 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. |
| |
| package runtime_test |
| |
| import ( |
| . "runtime" |
| "syscall" |
| "testing" |
| "time" |
| "unsafe" |
| ) |
| |
| var pid, tid int |
| |
| func init() { |
| // Record pid and tid of init thread for use during test. |
| // The call to LockOSThread is just to exercise it; |
| // we can't test that it does anything. |
| // Instead we're testing that the conditions are good |
| // for how it is used in init (must be on main thread). |
| pid, tid = syscall.Getpid(), syscall.Gettid() |
| LockOSThread() |
| |
| sysNanosleep = func(d time.Duration) { |
| // Invoke a blocking syscall directly; calling time.Sleep() |
| // would deschedule the goroutine instead. |
| ts := syscall.NsecToTimespec(d.Nanoseconds()) |
| for { |
| if err := syscall.Nanosleep(&ts, &ts); err != syscall.EINTR { |
| return |
| } |
| } |
| } |
| } |
| |
| func TestLockOSThread(t *testing.T) { |
| if pid != tid { |
| t.Fatalf("pid=%d but tid=%d", pid, tid) |
| } |
| } |
| |
| // Test that error values are negative. |
| // Use a misaligned pointer to get -EINVAL. |
| func TestMincoreErrorSign(t *testing.T) { |
| var dst byte |
| v := Mincore(Add(unsafe.Pointer(new(int32)), 1), 1, &dst) |
| |
| const EINVAL = 0x16 |
| if v != -EINVAL { |
| t.Errorf("mincore = %v, want %v", v, -EINVAL) |
| } |
| } |
| |
| func TestKernelStructSize(t *testing.T) { |
| // Check that the Go definitions of structures exchanged with the kernel are |
| // the same size as what the kernel defines. |
| if have, want := unsafe.Sizeof(Siginfo{}), uintptr(SiginfoMaxSize); have != want { |
| t.Errorf("Go's siginfo struct is %d bytes long; kernel expects %d", have, want) |
| } |
| if have, want := unsafe.Sizeof(Sigevent{}), uintptr(SigeventMaxSize); have != want { |
| t.Errorf("Go's sigevent struct is %d bytes long; kernel expects %d", have, want) |
| } |
| } |