]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/runtime_linux_test.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / src / runtime / runtime_linux_test.go
1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package runtime_test
6
7 import (
8         . "runtime"
9         "syscall"
10         "testing"
11         "time"
12         "unsafe"
13 )
14
15 var pid, tid int
16
17 func 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()
25
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         }
36 }
37
38 func TestLockOSThread(t *testing.T) {
39         if pid != tid {
40                 t.Fatalf("pid=%d but tid=%d", pid, tid)
41         }
42 }
43
44 // Test that error values are negative.
45 // Use a misaligned pointer to get -EINVAL.
46 func TestMincoreErrorSign(t *testing.T) {
47         var dst byte
48         v := Mincore(unsafe.Add(unsafe.Pointer(new(int32)), 1), 1, &dst)
49
50         const EINVAL = 0x16
51         if v != -EINVAL {
52                 t.Errorf("mincore = %v, want %v", v, -EINVAL)
53         }
54 }
55
56 func TestKernelStructSize(t *testing.T) {
57         // Check that the Go definitions of structures exchanged with the kernel are
58         // the same size as what the kernel defines.
59         if have, want := unsafe.Sizeof(Siginfo{}), uintptr(SiginfoMaxSize); have != want {
60                 t.Errorf("Go's siginfo struct is %d bytes long; kernel expects %d", have, want)
61         }
62         if have, want := unsafe.Sizeof(Sigevent{}), uintptr(SigeventMaxSize); have != want {
63                 t.Errorf("Go's sigevent struct is %d bytes long; kernel expects %d", have, want)
64         }
65 }