From 3f3b721140217c7d1d39850ddb26cd30c31039b6 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Mon, 23 Aug 2021 18:40:26 +0200 Subject: [PATCH] feat: added CPU limit (scheduler and speed limits) reader (#540) --- Modules/CPU/main.swift | 11 ++++++++++ Modules/CPU/readers.swift | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/Modules/CPU/main.swift b/Modules/CPU/main.swift index 3d58d777..129c828f 100644 --- a/Modules/CPU/main.swift +++ b/Modules/CPU/main.swift @@ -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?) { diff --git a/Modules/CPU/readers.swift b/Modules/CPU/readers.swift index c441ce62..6badf706 100644 --- a/Modules/CPU/readers.swift +++ b/Modules/CPU/readers.swift @@ -409,3 +409,49 @@ public class FrequencyReader: Reader { self.callback(value) } } + +public class LimitReader: Reader { + 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) + } +}