|  | // 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 address 1 (a misaligned | 
|  | // pointer) to get -EINVAL. | 
|  | func TestMincoreErrorSign(t *testing.T) { | 
|  | var dst byte | 
|  | v := Mincore(unsafe.Pointer(uintptr(1)), 1, &dst) | 
|  |  | 
|  | const EINVAL = 0x16 | 
|  | if v != -EINVAL { | 
|  | t.Errorf("mincore = %v, want %v", v, -EINVAL) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestEpollctlErrorSign(t *testing.T) { | 
|  | v := Epollctl(-1, 1, -1, unsafe.Pointer(&struct{}{})) | 
|  |  | 
|  | const EBADF = 0x09 | 
|  | if v != -EBADF { | 
|  | t.Errorf("epollctl = %v, want %v", v, -EBADF) | 
|  | } | 
|  | } |