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"
10 #include "base/files/file_util.h"
11 #include "base/format_macros.h"
13 namespace extensions
{
17 const char kProcStat
[] = "/proc/stat";
21 bool CpuInfoProvider::QueryCpuTimePerProcessor(
22 std::vector
<linked_ptr
<api::system_cpu::ProcessorInfo
>>* infos
) {
25 // WARNING: this method may return incomplete data because some processors may
26 // be brought offline at runtime. /proc/stat does not report statistics of
27 // offline processors. CPU usages of offline processors will be filled with
30 // An example of output of /proc/stat when processor 0 and 3 are online, but
31 // processor 1 and 2 are offline:
33 // cpu 145292 20018 83444 1485410 995 44 3578 0 0 0
34 // cpu0 138060 19947 78350 1479514 570 44 3576 0 0 0
35 // cpu3 2033 32 1075 1400 52 0 1 0 0 0
37 if (!base::ReadFileToString(base::FilePath(kProcStat
), &contents
))
40 std::istringstream
iss(contents
);
43 // Skip the first line because it is just an aggregated number of
45 std::getline(iss
, line
);
46 while (std::getline(iss
, line
)) {
47 if (line
.compare(0, 3, "cpu") != 0)
50 uint64 user
= 0, nice
= 0, sys
= 0, idle
= 0;
54 "cpu%" PRIu32
" %" PRIu64
" %" PRIu64
" %" PRIu64
" %" PRIu64
,
60 if (vals
!= 5 || pindex
>= infos
->size()) {
65 infos
->at(pindex
)->usage
.kernel
= static_cast<double>(sys
);
66 infos
->at(pindex
)->usage
.user
= static_cast<double>(user
+ nice
);
67 infos
->at(pindex
)->usage
.idle
= static_cast<double>(idle
);
68 infos
->at(pindex
)->usage
.total
=
69 static_cast<double>(sys
+ user
+ nice
+ idle
);
75 } // namespace extensions