Skip to content

Commit b0120ea

Browse files
committed
fix: fixed per-core CPU load calculation after tick counter overflow (#3529)
1 parent 327eb11 commit b0120ea

1 file changed

Lines changed: 16 additions & 21 deletions

File tree

Modules/CPU/readers.swift

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,27 +45,22 @@ internal class LoadReader: Reader<CPU_Load> {
4545
self.CPUUsageLock.lock()
4646
self.usagePerCore = []
4747

48-
for i in 0 ..< Int32(numCPUs) {
49-
var inUse: Int32
50-
var total: Int32
51-
if let prevCpuInfo = self.prevCpuInfo {
52-
inUse = self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
53-
&- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
54-
&+ self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
55-
&- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
56-
&+ self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
57-
&- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
58-
total = inUse &+ (self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]
59-
&- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)])
60-
} else {
61-
inUse = self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
62-
&+ self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
63-
&+ self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
64-
total = inUse &+ self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]
65-
}
66-
67-
if total != 0 {
68-
self.usagePerCore.append(Double(inUse) / Double(total))
48+
if let prevCpuInfo = self.prevCpuInfo {
49+
for i in 0 ..< Int32(self.numCPUs) {
50+
let user = UInt32(bitPattern: self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)])
51+
&- UInt32(bitPattern: prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)])
52+
let system = UInt32(bitPattern: self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)])
53+
&- UInt32(bitPattern: prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)])
54+
let nice = UInt32(bitPattern: self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)])
55+
&- UInt32(bitPattern: prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)])
56+
let idle = UInt32(bitPattern: self.cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)])
57+
&- UInt32(bitPattern: prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)])
58+
59+
let inUse = UInt64(user) + UInt64(system) + UInt64(nice)
60+
let total = inUse + UInt64(idle)
61+
if total != 0 {
62+
self.usagePerCore.append(min(1, Double(inUse) / Double(total)))
63+
}
6964
}
7065
}
7166
self.CPUUsageLock.unlock()

0 commit comments

Comments
 (0)