diff options
author | Yabin Cui <yabinc@google.com> | 2015-04-20 18:07:17 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2015-04-23 14:45:23 -0700 |
commit | 323e945313b190373b3fcfe578e25ee8390a76d3 (patch) | |
tree | e5019d88e283415b0f3d6e14c1c91df740110145 /simpleperf/environment.cpp | |
parent | 67d3abd7b26a741347b33402ad32f5c6735ca0bd (diff) | |
download | extras-323e945313b190373b3fcfe578e25ee8390a76d3.tar.gz |
Implement simpleperf stat subcommand.
Also add some simple unit-tests.
Change-Id: Ic30a2d4a879e028a8c82babbaf82e322fc49a838
Diffstat (limited to 'simpleperf/environment.cpp')
-rw-r--r-- | simpleperf/environment.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/simpleperf/environment.cpp b/simpleperf/environment.cpp new file mode 100644 index 00000000..14c256a5 --- /dev/null +++ b/simpleperf/environment.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "environment.h" + +#include <stdlib.h> +#include <vector> + +#include <base/logging.h> + +#include "utils.h" + +std::vector<int> GetOnlineCpus() { + std::vector<int> result; + FILE* fp = fopen("/sys/devices/system/cpu/online", "re"); + if (fp == nullptr) { + PLOG(ERROR) << "can't open online cpu information"; + return result; + } + + LineReader reader(fp); + char* line; + if ((line = reader.ReadLine()) != nullptr) { + result = GetOnlineCpusFromString(line); + } + CHECK(!result.empty()) << "can't get online cpu information"; + return result; +} + +std::vector<int> GetOnlineCpusFromString(const std::string& s) { + std::vector<int> result; + bool have_dash = false; + const char* p = s.c_str(); + char* endp; + long cpu; + // Parse line like: 0,1-3, 5, 7-8 + while ((cpu = strtol(p, &endp, 10)) != 0 || endp != p) { + if (have_dash && result.size() > 0) { + for (int t = result.back() + 1; t < cpu; ++t) { + result.push_back(t); + } + } + have_dash = false; + result.push_back(cpu); + p = endp; + while (!isdigit(*p) && *p != '\0') { + if (*p == '-') { + have_dash = true; + } + ++p; + } + } + return result; +} |