...
Source file src/pkg/cmd/vendor/golang.org/x/sys/unix/affinity_linux.go
1
2
3
4
5
6
7 package unix
8
9 import (
10 "unsafe"
11 )
12
13 const cpuSetSize = _CPU_SETSIZE / _NCPUBITS
14
15
16 type CPUSet [cpuSetSize]cpuMask
17
18 func schedAffinity(trap uintptr, pid int, set *CPUSet) error {
19 _, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set)))
20 if e != 0 {
21 return errnoErr(e)
22 }
23 return nil
24 }
25
26
27
28 func SchedGetaffinity(pid int, set *CPUSet) error {
29 return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set)
30 }
31
32
33
34 func SchedSetaffinity(pid int, set *CPUSet) error {
35 return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set)
36 }
37
38
39 func (s *CPUSet) Zero() {
40 for i := range s {
41 s[i] = 0
42 }
43 }
44
45 func cpuBitsIndex(cpu int) int {
46 return cpu / _NCPUBITS
47 }
48
49 func cpuBitsMask(cpu int) cpuMask {
50 return cpuMask(1 << (uint(cpu) % _NCPUBITS))
51 }
52
53
54 func (s *CPUSet) Set(cpu int) {
55 i := cpuBitsIndex(cpu)
56 if i < len(s) {
57 s[i] |= cpuBitsMask(cpu)
58 }
59 }
60
61
62 func (s *CPUSet) Clear(cpu int) {
63 i := cpuBitsIndex(cpu)
64 if i < len(s) {
65 s[i] &^= cpuBitsMask(cpu)
66 }
67 }
68
69
70 func (s *CPUSet) IsSet(cpu int) bool {
71 i := cpuBitsIndex(cpu)
72 if i < len(s) {
73 return s[i]&cpuBitsMask(cpu) != 0
74 }
75 return false
76 }
77
78
79 func (s *CPUSet) Count() int {
80 c := 0
81 for _, b := range s {
82 c += onesCount64(uint64(b))
83 }
84 return c
85 }
86
87
88
89
90 func onesCount64(x uint64) int {
91 const m0 = 0x5555555555555555
92 const m1 = 0x3333333333333333
93 const m2 = 0x0f0f0f0f0f0f0f0f
94 const m3 = 0x00ff00ff00ff00ff
95 const m4 = 0x0000ffff0000ffff
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 const m = 1<<64 - 1
117 x = x>>1&(m0&m) + x&(m0&m)
118 x = x>>2&(m1&m) + x&(m1&m)
119 x = (x>>4 + x) & (m2 & m)
120 x += x >> 8
121 x += x >> 16
122 x += x >> 32
123 return int(x) & (1<<7 - 1)
124 }
125
View as plain text