@@ -90,7 +90,6 @@ mod imp {
90
90
mod imp {
91
91
use std:: io;
92
92
use std:: ptr;
93
- use std:: slice;
94
93
95
94
type host_t = u32 ;
96
95
type mach_port_t = u32 ;
@@ -109,6 +108,7 @@ mod imp {
109
108
const CPU_STATE_SYSTEM : usize = 1 ;
110
109
const CPU_STATE_IDLE : usize = 2 ;
111
110
const CPU_STATE_NICE : usize = 3 ;
111
+ const CPU_STATE_MAX : usize = 4 ;
112
112
113
113
extern "C" {
114
114
static mut mach_task_self_: mach_port_t ;
@@ -135,39 +135,45 @@ mod imp {
135
135
nice : u64 ,
136
136
}
137
137
138
+ #[ repr( C ) ]
139
+ struct processor_cpu_load_info_data_t {
140
+ cpu_ticks : [ u32 ; CPU_STATE_MAX ] ,
141
+ }
142
+
138
143
pub fn current ( ) -> io:: Result < State > {
144
+ // There's scant little documentation on `host_processor_info`
145
+ // throughout the internet, so this is just modeled after what everyone
146
+ // else is doing. For now this is modeled largely after libuv.
147
+
139
148
unsafe {
140
149
let mut num_cpus_u = 0 ;
141
150
let mut cpu_info = ptr:: null_mut ( ) ;
142
- let mut cpu_info_cnt = 0 ;
151
+ let mut msg_type = 0 ;
143
152
let err = host_processor_info (
144
153
mach_host_self ( ) ,
145
154
PROESSOR_CPU_LOAD_INFO ,
146
155
& mut num_cpus_u,
147
156
& mut cpu_info,
148
- & mut cpu_info_cnt ,
157
+ & mut msg_type ,
149
158
) ;
150
159
if err != 0 {
151
160
return Err ( io:: Error :: last_os_error ( ) ) ;
152
161
}
153
- let cpu_info_slice = slice:: from_raw_parts ( cpu_info, cpu_info_cnt as usize ) ;
154
162
let mut ret = State {
155
163
user : 0 ,
156
164
system : 0 ,
157
165
idle : 0 ,
158
166
nice : 0 ,
159
167
} ;
160
- for chunk in cpu_info_slice. chunks ( num_cpus_u as usize ) {
161
- ret. user += chunk[ CPU_STATE_USER ] as u64 ;
162
- ret. system += chunk[ CPU_STATE_SYSTEM ] as u64 ;
163
- ret. idle += chunk[ CPU_STATE_IDLE ] as u64 ;
164
- ret. nice += chunk[ CPU_STATE_NICE ] as u64 ;
168
+ let mut current = cpu_info as * const processor_cpu_load_info_data_t ;
169
+ for _ in 0 ..num_cpus_u {
170
+ ret. user += ( * current) . cpu_ticks [ CPU_STATE_USER ] as u64 ;
171
+ ret. system += ( * current) . cpu_ticks [ CPU_STATE_SYSTEM ] as u64 ;
172
+ ret. idle += ( * current) . cpu_ticks [ CPU_STATE_IDLE ] as u64 ;
173
+ ret. nice += ( * current) . cpu_ticks [ CPU_STATE_NICE ] as u64 ;
174
+ current = current. offset ( 1 ) ;
165
175
}
166
- vm_deallocate (
167
- mach_task_self_,
168
- cpu_info as vm_address_t ,
169
- cpu_info_cnt as usize ,
170
- ) ;
176
+ vm_deallocate ( mach_task_self_, cpu_info as vm_address_t , msg_type as usize ) ;
171
177
Ok ( ret)
172
178
}
173
179
}
0 commit comments