You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.8 KiB

  1. //
  2. // CPU.swift
  3. // Menubar RunCat
  4. //
  5. // Created by Takuto Nakamura on 2019/08/06.
  6. // Copyright © 2019 Takuto Nakamura. All rights reserved.
  7. //
  8. import Darwin
  9. public class CPU {
  10. private let loadInfoCount: mach_msg_type_number_t!
  11. private var loadPrevious = host_cpu_load_info()
  12. init() {
  13. loadInfoCount = UInt32(MemoryLayout<host_cpu_load_info_data_t>.size / MemoryLayout<integer_t>.size)
  14. }
  15. private func hostCPULoadInfo() -> host_cpu_load_info {
  16. var size: mach_msg_type_number_t = loadInfoCount
  17. let hostInfo = host_cpu_load_info_t.allocate(capacity: 1)
  18. let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int(size)) { (pointer) -> kern_return_t in
  19. return host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, pointer, &size)
  20. }
  21. // kern_return_t == KERN_SUCCESS
  22. let data = hostInfo.move()
  23. hostInfo.deallocate()
  24. return data
  25. }
  26. public func usageCPU() -> (value: Double, description: String) {
  27. let load = hostCPULoadInfo()
  28. let userDiff = Double(load.cpu_ticks.0 - loadPrevious.cpu_ticks.0)
  29. let sysDiff = Double(load.cpu_ticks.1 - loadPrevious.cpu_ticks.1)
  30. let idleDiff = Double(load.cpu_ticks.2 - loadPrevious.cpu_ticks.2)
  31. let niceDiff = Double(load.cpu_ticks.3 - loadPrevious.cpu_ticks.3)
  32. loadPrevious = load
  33. let totalTicks = sysDiff + userDiff + idleDiff + niceDiff
  34. let sys = 100.0 * sysDiff / totalTicks
  35. let user = 100.0 * userDiff / totalTicks
  36. let value: Double = round((sys + user) * 10.0) / 10.0
  37. let description: String = (value >= 100.0) ? "100↑%" : ((value < 10.0 ? " " : "") + String(value)) + "% "
  38. return (value, description)
  39. }
  40. }