feat: added CPU limit (scheduler and speed limits) reader (#540)

This commit is contained in:
Serhiy Mytrovtsiy
2021-08-23 18:40:26 +02:00
parent 50b27fd0ef
commit 3f3b721140
2 changed files with 57 additions and 0 deletions

View File

@@ -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?) {

View File

@@ -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)
}
}