From f4289c16e78e9b2716c6b9af48b341ebe80ecc8a Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Thu, 15 Apr 2021 21:12:33 +0200 Subject: [PATCH] fix: another try to fix memory leak in the Apple Silicon Sensors reader (#417) --- Modules/Sensors/readers.swift | 56 ++++++++++++++----------------- Stats/Supporting Files/Info.plist | 2 +- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/Modules/Sensors/readers.swift b/Modules/Sensors/readers.swift index 414feb17..e2f3e0ee 100644 --- a/Modules/Sensors/readers.swift +++ b/Modules/Sensors/readers.swift @@ -83,23 +83,16 @@ internal class x86_SensorsReader: SensorsReader { internal class AppleSilicon_SensorsReader: SensorsReader { private let types: [SensorType] = [.temperature, .current, .voltage] + private var cache: [String: Sensor_t] = ["1": Sensor_t(key: "test", name: "test", group: .sensor, type: .temperature)] init() { super.init() for type in types { - for (name, value) in self.fetch(type: type) { - self.list.append(Sensor_t( - key: name, - name: name, - value: value, - group: .system, - type: type - )) - } + self.fetch(type: type) } - self.list = self.list.filter({ (s: Sensor_t) -> Bool in + self.list = self.cache.map{ $0.value }.filter({ (s: Sensor_t) -> Bool in switch s.type { case .temperature: return s.value < 110 @@ -114,18 +107,12 @@ internal class AppleSilicon_SensorsReader: SensorsReader { public override func read() { for type in types { - for (name, value) in self.fetch(type: type) { - if let idx = self.list.firstIndex(where: { $0.name == name && $0.type == type }) { - self.list[idx].value = value - } - } + self.fetch(type: type) } - self.callback(self.list) + self.callback(self.cache.map{ $0.value }) } - private func fetch(type: SensorType) -> [String: Double] { - var list: [String: Double] = [:] - + private func fetch(type: SensorType) { var page: Int = 0 var usage: Int = 0 var eventType: Int32 = kIOHIDEventTypeTemperature @@ -161,7 +148,7 @@ internal class AppleSilicon_SensorsReader: SensorsReader { } guard let client = IOHIDEventSystemClientCreate(kCFAllocatorDefault) else { - return list + return } let system: IOHIDEventSystemClient = client.takeRetainedValue() @@ -169,7 +156,7 @@ internal class AppleSilicon_SensorsReader: SensorsReader { IOHIDEventSystemClientSetMatching(system, dict) guard let services: CFArray = IOHIDEventSystemClientCopyServices(system) else { - return list + return } for i in 0..? = IOHIDServiceClientCopyProperty(service.pointee, "Product" as CFString) - let eventPtr: IOHIDEventRef? = IOHIDServiceClientCopyEvent(service.pointee, Int64(eventType), 0, 0) - guard let name = namePtr?.takeRetainedValue() else { + guard let nameCF = namePtr?.takeRetainedValue() else { return } - var value: Double? = nil + let name = nameCF as String - if eventPtr != nil { - value = IOHIDEventGetFloatValue(eventPtr, eventType << 16) - } - - if let value = value { - list[name as String] = value + if let eventPtr: IOHIDEventRef = IOHIDServiceClientCopyEvent(service.pointee, Int64(eventType), 0, 0) { + let value = IOHIDEventGetFloatValue(eventPtr, eventType << 16) + + if self.cache.keys.contains(name) { + self.cache[name]?.value = value + } else { + self.cache[name] = Sensor_t( + key: name, + name: name, + value: value, + group: .system, + type: type + ) + } } } } - return list + return } private func createDeviceMatchingDictionary(usagePage: Int, usage: Int) -> CFMutableDictionary { diff --git a/Stats/Supporting Files/Info.plist b/Stats/Supporting Files/Info.plist index dc394a94..a1008232 100755 --- a/Stats/Supporting Files/Info.plist +++ b/Stats/Supporting Files/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 226 + 228 Description Simple macOS system monitor in your menu bar LSApplicationCategoryType