-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcpu_darwin.go
More file actions
98 lines (81 loc) · 2.5 KB
/
cpu_darwin.go
File metadata and controls
98 lines (81 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package xpe
import (
"fmt"
"golang.org/x/sys/unix"
)
type sysctler interface {
Sysctl(name string) (value string, err error)
SysctlUint32(name string) (value uint32, err error)
}
type nativeSyscallPackage struct{}
func (s nativeSyscallPackage) Sysctl(name string) (value string, err error) {
return unix.Sysctl(name)
}
func (s nativeSyscallPackage) SysctlUint32(name string) (value uint32, err error) {
return unix.SysctlUint32(name)
}
var darwinsys sysctler = nativeSyscallPackage{}
func GetCPU() (*CPU, error) {
const (
cpuBrandString = "machdep.cpu.brand_string"
cpuThreadCount = "machdep.cpu.thread_count"
cpuCoreCount = "machdep.cpu.core_count"
hwNPerflevels = "hw.nperflevels"
lpKey = "hw.perflevel0.logicalcpu"
leKey = "hw.perflevel1.logicalcpu"
ppKey = "hw.perflevel0.physicalcpu"
peKey = "hw.perflevel1.physicalcpu"
)
brandString, err := darwinsys.Sysctl(cpuBrandString)
if err != nil {
return nil, fmt.Errorf("failed to get %v: %w", cpuBrandString, err)
}
threads, err := darwinsys.SysctlUint32(cpuThreadCount)
if err != nil {
return nil, fmt.Errorf("failed to get %v: %w", cpuThreadCount, err)
}
cores, err := darwinsys.SysctlUint32(cpuCoreCount)
if err != nil {
return nil, fmt.Errorf("failed to get %v: %w", cpuCoreCount, err)
}
perfLevels, err := darwinsys.SysctlUint32(hwNPerflevels)
if err != nil {
// TODO: seems might not exist on older versions of macOS? lets not error if so
return &CPU{
BrandString: brandString,
Threads: int(threads),
Cores: int(cores),
}, nil
}
var lpCores, ppCores uint32
if perfLevels >= 1 {
lpCores, err = darwinsys.SysctlUint32(lpKey)
if err != nil {
return nil, fmt.Errorf("failed to get %v: %w", lpKey, err)
}
ppCores, err = darwinsys.SysctlUint32(ppKey)
if err != nil {
return nil, fmt.Errorf("failed to get %v: %w", ppKey, err)
}
}
var leCores, peCores uint32
if perfLevels >= 2 {
leCores, err = darwinsys.SysctlUint32(leKey)
if err != nil {
return nil, fmt.Errorf("failed to get %v: %w", leKey, err)
}
peCores, err = darwinsys.SysctlUint32(peKey)
if err != nil {
return nil, fmt.Errorf("failed to get %v: %w", peKey, err)
}
}
return &CPU{
BrandString: brandString,
Threads: int(threads),
Cores: int(cores),
LogicalPerformanceCores: int(lpCores),
LogicalEfficiencyCores: int(leCores),
PhysicalPerformanceCores: int(ppCores),
PhysicalEfficiencyCores: int(peCores),
}, nil
}