fix: fixed cases when cpu total freq will be NaN (#3086)

This commit is contained in:
Serhiy Mytrovtsiy
2026-03-28 13:39:10 +01:00
parent 6d466e4501
commit 867b3d4161
7 changed files with 46 additions and 27 deletions

View File

@@ -31,16 +31,11 @@ public struct CPU_Load: Codable, RemoteType {
}
}
public struct CPU_Frequency: Codable, RemoteType {
var value: Double = 0
public struct CPU_Frequency: Codable {
var value: Double? = nil
var eCore: Double? = nil
var pCore: Double? = nil
var sCore: Double? = nil
public func remote() -> Data? {
let string = "1,1,\(self.value)$"
return string.data(using: .utf8)
}
}
public struct CPU_Limit: Codable {

View File

@@ -458,15 +458,17 @@ internal class Popup: PopupWrapper {
}
if (self.window?.isVisible ?? false) || !self.initializedFrequency {
if value.value > self.maxFreq {
self.maxFreq = value.value
}
self.coresFreqField?.stringValue = "\(Int(value.value)) MHz"
if let circle = self.frequencyCircle {
circle.setValue((100*value.value)/self.maxFreq)
circle.setText("\((value.value/1000).rounded(toPlaces: 2))")
circle.toolTip = "\(localizedString("CPU frequency")): \(Int(value.value)) MHz - \(((100*value.value)/self.maxFreq).rounded(toPlaces: 2))%"
if let v = value.value {
if v > self.maxFreq {
self.maxFreq = v
}
self.coresFreqField?.stringValue = "\(Int(v)) MHz"
if let circle = self.frequencyCircle {
circle.setValue((100*v)/self.maxFreq)
circle.setText("\((v/1000).rounded(toPlaces: 2))")
circle.toolTip = "\(localizedString("CPU frequency")): \(Int(v)) MHz - \(((100*v)/self.maxFreq).rounded(toPlaces: 2))%"
}
}
if let v = value.eCore {

View File

@@ -372,14 +372,14 @@ public class FrequencyReader: Reader<CPU_Frequency> {
for sample in samples {
guard sample.group == "CPU Stats" else { continue }
if sample.channel.starts(with: "ECPU") {
if sample.channel.contains("ECPU") {
eCore.append(self.calculateFrequencies(dict: sample.delta, freqs: self.eCoreFreqs))
}
if sample.channel.starts(with: self.sCoreCount == 0 ? "PCPU" : "MCPU") {
if sample.channel.contains(self.sCoreCount == 0 ? "PCPU" : "MCPU") {
pCore.append(self.calculateFrequencies(dict: sample.delta, freqs: self.pCoreFreqs))
}
if self.sCoreCount != 0 {
if sample.channel.starts(with: "PCPU") {
if sample.channel.contains("PCPU") {
sCore.append(self.calculateFrequencies(dict: sample.delta, freqs: self.sCoreFreqs))
}
}
@@ -400,8 +400,22 @@ public class FrequencyReader: Reader<CPU_Frequency> {
let pFreq: Double? = pCores.isEmpty ? nil : pCores.reduce(0, +) / Double(self.measurementCount)
let sFreq: Double? = sCores.isEmpty ? nil : sCores.reduce(0, +) / Double(self.measurementCount)
let activeCores: Double = (eFreq != nil ? self.eCoreCount : 0) + (sFreq != nil ? self.sCoreCount : 0) + (pFreq != nil ? self.pCoreCount : 0)
let value: Double = ((eFreq ?? 0) * self.eCoreCount + (sFreq ?? 0) * self.sCoreCount + (pFreq ?? 0) * self.pCoreCount) / activeCores
var activeCores: Double = 0
var totalFreq: Double = 0
if let freq = eFreq {
activeCores += self.eCoreCount
totalFreq += freq * self.eCoreCount
}
if let freq = pFreq {
activeCores += self.pCoreCount
totalFreq += freq * self.pCoreCount
}
if let freq = sFreq {
activeCores += self.sCoreCount
totalFreq += freq * self.sCoreCount
}
let value: Double? = activeCores > 0 ? totalFreq / activeCores : nil
self.callback(CPU_Frequency(value: value, eCore: eFreq, pCore: pFreq, sCore: sFreq))
self.isReading = false

View File

@@ -58,6 +58,9 @@ public struct drive: Codable {
if usedSpace < 0 {
usedSpace = 0
}
if total == 0 {
return 0
}
return Double(usedSpace) / Double(total)
}
@@ -319,10 +322,14 @@ public class Disk: Module {
}
case "$percentage":
var percentage: Int
switch pair.value {
case "used": percentage = Int((Double(d.size - d.free) / Double(d.size)) * 100)
case "free": percentage = Int((Double(d.free) / Double(d.size)) * 100)
default: return
if d.size == 0 {
percentage = 0
} else {
switch pair.value {
case "used": percentage = Int((Double(d.size - d.free) / Double(d.size)) * 100)
case "free": percentage = Int((Double(d.free) / Double(d.size)) * 100)
default: return
}
}
replacement = "\(percentage < 0 ? 0 : percentage)%"
default: return

View File

@@ -30,6 +30,7 @@ extension CWPHYMode: @retroactive CustomStringConvertible {
case .mode11g: return "802.11g"
case .mode11n: return "802.11n"
case .mode11ax: return "802.11ax"
case .mode11be: return "802.11be"
case .modeNone: return "none"
@unknown default: return "unknown"
}

View File

@@ -17,7 +17,7 @@
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>776</string>
<string>777</string>
<key>Description</key>
<string>Simple macOS system monitor in your menu bar</string>
<key>LSApplicationCategoryType</key>

View File

@@ -13,7 +13,7 @@
<key>CFBundleShortVersionString</key>
<string>2.12.6</string>
<key>CFBundleVersion</key>
<string>776</string>
<string>777</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>