1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "extensions/browser/api/system_cpu/cpu_info_provider.h"
7 #include <mach/mach_host.h>
9 #include "base/mac/scoped_mach_port.h"
10 #include "base/sys_info.h"
12 namespace extensions
{
14 bool CpuInfoProvider::QueryCpuTimePerProcessor(
15 std::vector
<linked_ptr
<api::system_cpu::ProcessorInfo
>>* infos
) {
18 natural_t num_of_processors
;
19 base::mac::ScopedMachSendRight
host(mach_host_self());
20 mach_msg_type_number_t type
;
21 processor_cpu_load_info_data_t
* cpu_infos
;
23 if (host_processor_info(host
.get(),
24 PROCESSOR_CPU_LOAD_INFO
,
26 reinterpret_cast<processor_info_array_t
*>(&cpu_infos
),
27 &type
) == KERN_SUCCESS
) {
28 DCHECK_EQ(num_of_processors
,
29 static_cast<natural_t
>(base::SysInfo::NumberOfProcessors()));
30 DCHECK_EQ(num_of_processors
, static_cast<natural_t
>(infos
->size()));
32 for (natural_t i
= 0; i
< num_of_processors
; ++i
) {
33 double user
= static_cast<double>(cpu_infos
[i
].cpu_ticks
[CPU_STATE_USER
]),
35 static_cast<double>(cpu_infos
[i
].cpu_ticks
[CPU_STATE_SYSTEM
]),
36 nice
= static_cast<double>(cpu_infos
[i
].cpu_ticks
[CPU_STATE_NICE
]),
37 idle
= static_cast<double>(cpu_infos
[i
].cpu_ticks
[CPU_STATE_IDLE
]);
39 infos
->at(i
)->usage
.kernel
= sys
;
40 infos
->at(i
)->usage
.user
= user
+ nice
;
41 infos
->at(i
)->usage
.idle
= idle
;
42 infos
->at(i
)->usage
.total
= sys
+ user
+ nice
+ idle
;
45 vm_deallocate(mach_task_self(),
46 reinterpret_cast<vm_address_t
>(cpu_infos
),
47 num_of_processors
* sizeof(processor_cpu_load_info
));
55 } // namespace extensions