mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
feat: added CPU limit (scheduler and speed limits) reader (#540)
This commit is contained in:
@@ -24,6 +24,12 @@ public struct CPU_Load: value_t {
|
||||
}
|
||||
}
|
||||
|
||||
public struct CPU_Limit {
|
||||
var scheduler: Int = 0
|
||||
var cpus: Int = 0
|
||||
var speed: Int = 0
|
||||
}
|
||||
|
||||
public class CPU: Module {
|
||||
private var popupView: Popup
|
||||
private var settingsView: Settings
|
||||
@@ -32,6 +38,7 @@ public class CPU: Module {
|
||||
private var processReader: ProcessReader? = nil
|
||||
private var temperatureReader: TemperatureReader? = nil
|
||||
private var frequencyReader: FrequencyReader? = nil
|
||||
private var limitReader: LimitReader? = nil
|
||||
|
||||
private var usagePerCoreState: Bool {
|
||||
get {
|
||||
@@ -56,6 +63,7 @@ public class CPU: Module {
|
||||
|
||||
self.loadReader = LoadReader()
|
||||
self.processReader = ProcessReader()
|
||||
self.limitReader = LimitReader(popup: true)
|
||||
|
||||
#if arch(x86_64)
|
||||
self.temperatureReader = TemperatureReader(popup: true)
|
||||
@@ -120,6 +128,9 @@ public class CPU: Module {
|
||||
if let reader = self.frequencyReader {
|
||||
self.addReader(reader)
|
||||
}
|
||||
if let reader = self.limitReader {
|
||||
self.addReader(reader)
|
||||
}
|
||||
}
|
||||
|
||||
private func loadCallback(_ raw: CPU_Load?) {
|
||||
|
||||
@@ -409,3 +409,49 @@ public class FrequencyReader: Reader<Double> {
|
||||
self.callback(value)
|
||||
}
|
||||
}
|
||||
|
||||
public class LimitReader: Reader<CPU_Limit> {
|
||||
private var limits: CPU_Limit = CPU_Limit()
|
||||
|
||||
public override func read() {
|
||||
let task = Process()
|
||||
task.launchPath = "/usr/bin/pmset"
|
||||
task.arguments = ["-g", "therm"]
|
||||
|
||||
let outputPipe = Pipe()
|
||||
defer {
|
||||
outputPipe.fileHandleForReading.closeFile()
|
||||
}
|
||||
task.standardOutput = outputPipe
|
||||
|
||||
do {
|
||||
try task.run()
|
||||
} catch let err {
|
||||
error("error read pmset: \(err.localizedDescription)", log: self.log)
|
||||
return
|
||||
}
|
||||
|
||||
let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
|
||||
var lines = String(decoding: outputData, as: UTF8.self).split(separator: "\n")
|
||||
if lines.isEmpty {
|
||||
return
|
||||
}
|
||||
lines.removeFirst(3)
|
||||
|
||||
lines.forEach { (line: Substring) in
|
||||
guard let value = Int(line.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) else {
|
||||
return
|
||||
}
|
||||
|
||||
if line.contains("Scheduler") {
|
||||
self.limits.scheduler = value
|
||||
} else if line.contains("CPUs") {
|
||||
self.limits.cpus = value
|
||||
} else if line.contains("Speed") {
|
||||
self.limits.speed = value
|
||||
}
|
||||
}
|
||||
|
||||
self.callback(self.limits)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user