From 7c11d82914e3defdf16ec1c70a7c0631e06a3cbc Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 10 Oct 2020 14:11:57 +0200 Subject: [PATCH] - fix hyperthreading cores option CPU without hyperthreading on the CPU module (#104) --- Modules/CPU/readers.swift | 5 ++++- Modules/CPU/settings.swift | 28 ++++++++++++++++------------ StatsKit/helpers.swift | 11 +++++++++++ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Modules/CPU/readers.swift b/Modules/CPU/readers.swift index 112a095a..450926fc 100644 --- a/Modules/CPU/readers.swift +++ b/Modules/CPU/readers.swift @@ -24,12 +24,14 @@ internal class LoadReader: Reader { private var numCPUs: uint = 0 private let CPUUsageLock: NSLock = NSLock() private var previousInfo = host_cpu_load_info() + private var hasHyperthreadingCores = false private var response: CPU_Load = CPU_Load() private var numCPUsU: natural_t = 0 private var usagePerCore: [Double] = [] public override func setup() { + self.hasHyperthreadingCores = SysctlByName("hw.physicalcpu") != SysctlByName("hw.logicalcpu") [CTL_HW, HW_NCPU].withUnsafeBufferPointer() { mib in var sizeOfNumCPUs: size_t = MemoryLayout.size let status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0) @@ -70,7 +72,8 @@ internal class LoadReader: Reader { } self.CPUUsageLock.unlock() - if self.store?.pointee.bool(key: "CPU_hyperhreading", defaultValue: false) ?? false { + let showHyperthratedCores = self.store?.pointee.bool(key: "CPU_hyperhreading", defaultValue: false) ?? false + if showHyperthratedCores || !self.hasHyperthreadingCores { self.response.usagePerCore = self.usagePerCore } else { var i = 0 diff --git a/Modules/CPU/settings.swift b/Modules/CPU/settings.swift index 11b1bb00..ac0cc325 100644 --- a/Modules/CPU/settings.swift +++ b/Modules/CPU/settings.swift @@ -21,6 +21,7 @@ internal class Settings: NSView, Settings_v { private let title: String private let store: UnsafePointer + private var hasHyperthreadingCores = false public var callback: (() -> Void) = {} public var setInterval: ((_ value: Double) -> Void) = {_ in } @@ -36,6 +37,7 @@ internal class Settings: NSView, Settings_v { if !self.usagePerCoreState { self.hyperthreadState = false } + self.hasHyperthreadingCores = SysctlByName("hw.physicalcpu") != SysctlByName("hw.logicalcpu") super.init(frame: CGRect( x: 0, @@ -56,7 +58,7 @@ internal class Settings: NSView, Settings_v { self.subviews.forEach{ $0.removeFromSuperview() } let rowHeight: CGFloat = 30 - let num: CGFloat = widget == .barChart ? 2 : 0 + let num: CGFloat = widget == .barChart ? self.hasHyperthreadingCores ? 2 : 1 : 0 self.addSubview(SelectTitleRow( frame: NSRect(x: Constants.Settings.margin, y: Constants.Settings.margin + (rowHeight + Constants.Settings.margin) * num, width: self.frame.width - (Constants.Settings.margin*2), height: rowHeight), @@ -68,23 +70,25 @@ internal class Settings: NSView, Settings_v { if widget == .barChart { self.addSubview(ToggleTitleRow( - frame: NSRect(x: Constants.Settings.margin, y: Constants.Settings.margin + (rowHeight + Constants.Settings.margin) * 1, width: self.frame.width - (Constants.Settings.margin*2), height: rowHeight), + frame: NSRect(x: Constants.Settings.margin, y: Constants.Settings.margin + (rowHeight + Constants.Settings.margin) * (num-1), width: self.frame.width - (Constants.Settings.margin*2), height: rowHeight), title: LocalizedString("Show usage per core"), action: #selector(toggleUsagePerCore), state: self.usagePerCoreState )) - self.hyperthreadView = ToggleTitleRow( - frame: NSRect(x: Constants.Settings.margin, y: Constants.Settings.margin + (rowHeight + Constants.Settings.margin) * 0, width: self.frame.width - (Constants.Settings.margin*2), height: rowHeight), - title: LocalizedString("Show hyper-threading cores"), - action: #selector(toggleMultithreading), - state: self.hyperthreadState - ) - if !self.usagePerCoreState { - FindAndToggleEnableNSControlState(self.hyperthreadView, state: false) - FindAndToggleNSControlState(self.hyperthreadView, state: .off) + if self.hasHyperthreadingCores { + self.hyperthreadView = ToggleTitleRow( + frame: NSRect(x: Constants.Settings.margin, y: Constants.Settings.margin + (rowHeight + Constants.Settings.margin) * (num-2), width: self.frame.width - (Constants.Settings.margin*2), height: rowHeight), + title: LocalizedString("Show hyper-threading cores"), + action: #selector(toggleMultithreading), + state: self.hyperthreadState + ) + if !self.usagePerCoreState { + FindAndToggleEnableNSControlState(self.hyperthreadView, state: false) + FindAndToggleNSControlState(self.hyperthreadView, state: .off) + } + self.addSubview(self.hyperthreadView!) } - self.addSubview(self.hyperthreadView!) } self.setFrameSize(NSSize(width: self.frame.width, height: (rowHeight*(num+1)) + (Constants.Settings.margin*(2+num)))) diff --git a/StatsKit/helpers.swift b/StatsKit/helpers.swift index 0be11f8d..3811cae9 100644 --- a/StatsKit/helpers.swift +++ b/StatsKit/helpers.swift @@ -616,3 +616,14 @@ public func Temperature(_ value: Double) -> String { return formatter.string(from: measurement) } + +public func SysctlByName(_ name: String) -> Int64 { + var num: Int64 = 0 + var size = MemoryLayout.size + + if sysctlbyname(name, &num, &size, nil, 0) != 0 { + print(POSIXError.Code(rawValue: errno).map { POSIXError($0) } ?? CocoaError(.fileReadUnknown)) + } + + return num +}