blob: 6e5c81acd049166a0f310011ffb742f7ee2c9192 [file] [log] [blame]
Don Newton98fd8812019-09-23 15:15:02 -04001// Copyright 2018 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// CPU affinity functions
6
7package unix
8
9import (
Don Newton7577f072020-01-06 12:41:11 -050010 "math/bits"
Don Newton98fd8812019-09-23 15:15:02 -040011 "unsafe"
12)
13
14const cpuSetSize = _CPU_SETSIZE / _NCPUBITS
15
16// CPUSet represents a CPU affinity mask.
17type CPUSet [cpuSetSize]cpuMask
18
19func schedAffinity(trap uintptr, pid int, set *CPUSet) error {
20 _, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set)))
21 if e != 0 {
22 return errnoErr(e)
23 }
24 return nil
25}
26
27// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid.
28// If pid is 0 the calling thread is used.
29func SchedGetaffinity(pid int, set *CPUSet) error {
30 return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set)
31}
32
33// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid.
34// If pid is 0 the calling thread is used.
35func SchedSetaffinity(pid int, set *CPUSet) error {
36 return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set)
37}
38
39// Zero clears the set s, so that it contains no CPUs.
40func (s *CPUSet) Zero() {
41 for i := range s {
42 s[i] = 0
43 }
44}
45
46func cpuBitsIndex(cpu int) int {
47 return cpu / _NCPUBITS
48}
49
50func cpuBitsMask(cpu int) cpuMask {
51 return cpuMask(1 << (uint(cpu) % _NCPUBITS))
52}
53
54// Set adds cpu to the set s.
55func (s *CPUSet) Set(cpu int) {
56 i := cpuBitsIndex(cpu)
57 if i < len(s) {
58 s[i] |= cpuBitsMask(cpu)
59 }
60}
61
62// Clear removes cpu from the set s.
63func (s *CPUSet) Clear(cpu int) {
64 i := cpuBitsIndex(cpu)
65 if i < len(s) {
66 s[i] &^= cpuBitsMask(cpu)
67 }
68}
69
70// IsSet reports whether cpu is in the set s.
71func (s *CPUSet) IsSet(cpu int) bool {
72 i := cpuBitsIndex(cpu)
73 if i < len(s) {
74 return s[i]&cpuBitsMask(cpu) != 0
75 }
76 return false
77}
78
79// Count returns the number of CPUs in the set s.
80func (s *CPUSet) Count() int {
81 c := 0
82 for _, b := range s {
Don Newton7577f072020-01-06 12:41:11 -050083 c += bits.OnesCount64(uint64(b))
Don Newton98fd8812019-09-23 15:15:02 -040084 }
85 return c
86}