@@ -25,48 +25,76 @@ extension kIORep {
2525 }
2626}
2727
28+ var cpu = " "
29+ var size = 0
30+ let getcpu = " machdep.cpu.brand_string "
31+ sysctlbyname ( getcpu, nil , & size, nil , 0 )
32+ var cpubrand = [ CChar] ( repeating: 0 , count: size)
33+ sysctlbyname ( getcpu, & cpubrand, & size, nil , 0 )
34+ var clusters = 2
35+
36+ if strcmp ( cpubrand, " " ) != 0 {
37+ cpubrand. withUnsafeBufferPointer {
38+ ptr in cpu += String ( cString: ptr. baseAddress!)
39+ }
40+ }
41+ cpu = cpu. lowercased ( )
42+
43+ if cpu. contains ( " pro " ) || cpu. contains ( " max " ) {
44+ clusters = 3
45+ } else if cpu. contains ( " ultra " ) {
46+ clusters = 6
47+ }
48+
2849var subchn : Unmanaged < CFMutableDictionary > ? = nil
2950var chn = IOReportCopyAllChannels ( 0 , 0 )
3051var sub = IOReportCreateSubscription ( nil , chn? . takeRetainedValue ( ) , & subchn, 0 , nil )
3152
3253let interval : Double = 175
3354
34- var samples_a = IOReportCreateSamples ( sub, subchn? . takeUnretainedValue ( ) , nil ) . takeRetainedValue ( )
55+ var samples_a = IOReportCreateSamples ( sub, subchn? . takeUnretainedValue ( ) , nil )
3556
3657Thread . sleep ( forTimeInterval: interval*1e- 3 )
3758
38- var samples_b = IOReportCreateSamples ( sub, subchn? . takeUnretainedValue ( ) , nil ) . takeRetainedValue ( )
59+ var samples_b = IOReportCreateSamples ( sub, subchn? . takeUnretainedValue ( ) , nil )
3960
40- let samp_delta = Array ( ( IOReportCreateSamplesDelta (
41- samples_a, samples_b, nil
42- ) . takeRetainedValue ( ) as Dictionary ) . values) [ 0 ] as! Array < CFDictionary >
61+ let samp_delta = IOReportCreateSamplesDelta ( samples_a? . takeUnretainedValue ( ) , samples_b? . takeUnretainedValue ( ) , nil )
4362
44- for sample in samp_delta {
45- let group = IOReportChannelGetGroup ( sample)
46- var subgroup = IOReportChannelGetSubGroup ( sample)
47- let chann_name = IOReportChannelGetChannelName ( sample)
48- let names = [ " CPU Stats " , " GPU Stats " , " AMC Stats " , " CLPC Stats " , " PMP " , " Energy Model " ]
49- if names. contains ( group!) {
50- switch IOReportChannelGetFormat ( sample) {
51- case kIORep. kIOReportFormatSimple. rawValue:
52- if subgroup == nil {
53- subgroup = " "
54- }
55- print ( " Grp: \( group!) Subgrp: \( subgroup!) Chn: \( chann_name!) " + String( format: " Value: %ld \n " , IOReportSimpleGetIntegerValue ( sample, 0 ) ) )
56- break
57- case kIORep. kIOReportFormatState. rawValue:
58- for i in 0 ..< IOReportStateGetCount ( sample) {
59- let tmp = IOReportStateGetResidency ( sample, i)
60- print ( " Grp: \( group!) Subgrp: \( subgroup!) Chn: \( chann_name!) " + String( format: " State: \( IOReportStateGetNameForIndex ( sample, i) !) Res: %lld \n " , tmp) )
61- }
62- break
63- case kIORep. kIOReportFormatSimpleArray. rawValue:
64- for i in stride ( from: 2 , to: - 1 , by: - 1 ) {
65- print ( " Grp: \( group!) Subgrp: \( subgroup!) Chn: \( chann_name!) " + String( format: " Arr: %llu \n " , IOReportArrayGetValueAtIndex ( sample, Int32 ( 2 - i) ) ) )
63+ samples_a? . release ( )
64+ samples_b? . release ( )
65+
66+ let names = [ " CPU Stats " , " GPU Stats " , " AMC Stats " , " CLPC Stats " , " PMP " , " Energy Model " ]
67+ IOReportIterate ( samp_delta? . takeUnretainedValue ( ) , { sample in
68+ autoreleasepool {
69+ var group = IOReportChannelGetGroup ( sample)
70+ var subgroup = IOReportChannelGetSubGroup ( sample)
71+ var chann_name = IOReportChannelGetChannelName ( sample)
72+ if names. contains ( group!) {
73+ switch IOReportChannelGetFormat ( sample) {
74+ case kIORep. kIOReportFormatSimple. rawValue:
75+ var tmp : Int ? = IOReportSimpleGetIntegerValue ( sample, 0 )
76+ print ( " Grp: \( group!) Subgrp: \( subgroup ?? " " ) Chn: \( chann_name!) " + String( format: " Value: %ld \n " , tmp!) )
77+ tmp = nil
78+ case kIORep. kIOReportFormatState. rawValue:
79+ for i in 0 ..< IOReportStateGetCount ( sample) {
80+ var tmp : UInt64 ? = IOReportStateGetResidency ( sample, i)
81+ var idx = IOReportStateGetNameForIndex ( sample, i)
82+ print ( " Grp: \( group!) Subgrp: \( subgroup!) Chn: \( chann_name!) " + String( format: " State: \( idx!) Res: %lld \n " , tmp!) )
83+ tmp = nil
84+ idx = nil
85+ }
86+ case kIORep. kIOReportFormatSimpleArray. rawValue:
87+ for i in 0 ..< clusters {
88+ var idx : UInt64 ? = IOReportArrayGetValueAtIndex ( sample, Int32 ( 2 - i) )
89+ print ( " Grp: \( group!) Subgrp: \( subgroup!) Chn: \( chann_name!) " + String( format: " Arr: %llu \n " , idx!) )
90+ idx = nil
91+ }
92+ default : break
6693 }
67- break
68- default : break
6994 }
95+ group = nil
96+ subgroup = nil
97+ chann_name = nil
7098 }
71- }
72-
99+ return Int32 ( kIOReportIterOk )
100+ } )
0 commit comments