70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
//===-- Procfs.cpp --------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "Procfs.h"
|
|
#include "lldb/Host/linux/Support.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/Threading.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
using namespace process_linux;
|
|
using namespace llvm;
|
|
|
|
Expected<ArrayRef<uint8_t>> lldb_private::process_linux::GetProcfsCpuInfo() {
|
|
static ErrorOr<std::unique_ptr<MemoryBuffer>> cpu_info_or_err =
|
|
getProcFile("cpuinfo");
|
|
|
|
if (!*cpu_info_or_err)
|
|
cpu_info_or_err.getError();
|
|
|
|
MemoryBuffer &buffer = **cpu_info_or_err;
|
|
return arrayRefFromStringRef(buffer.getBuffer());
|
|
}
|
|
|
|
Expected<std::vector<cpu_id_t>>
|
|
lldb_private::process_linux::GetAvailableLogicalCoreIDs(StringRef cpuinfo) {
|
|
SmallVector<StringRef, 8> lines;
|
|
cpuinfo.split(lines, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
|
|
std::vector<cpu_id_t> logical_cores;
|
|
|
|
for (StringRef line : lines) {
|
|
std::pair<StringRef, StringRef> key_value = line.split(':');
|
|
auto key = key_value.first.trim();
|
|
auto val = key_value.second.trim();
|
|
if (key == "processor") {
|
|
cpu_id_t processor;
|
|
if (val.getAsInteger(10, processor))
|
|
return createStringError(
|
|
inconvertibleErrorCode(),
|
|
"Failed parsing the /proc/cpuinfo line entry: %s", line.data());
|
|
logical_cores.push_back(processor);
|
|
}
|
|
}
|
|
return logical_cores;
|
|
}
|
|
|
|
llvm::Expected<llvm::ArrayRef<cpu_id_t>>
|
|
lldb_private::process_linux::GetAvailableLogicalCoreIDs() {
|
|
static Optional<std::vector<cpu_id_t>> logical_cores_ids;
|
|
if (!logical_cores_ids) {
|
|
// We find the actual list of core ids by parsing /proc/cpuinfo
|
|
Expected<ArrayRef<uint8_t>> cpuinfo = GetProcfsCpuInfo();
|
|
if (!cpuinfo)
|
|
return cpuinfo.takeError();
|
|
|
|
Expected<std::vector<cpu_id_t>> cpu_ids = GetAvailableLogicalCoreIDs(
|
|
StringRef(reinterpret_cast<const char *>(cpuinfo->data())));
|
|
if (!cpu_ids)
|
|
return cpu_ids.takeError();
|
|
|
|
logical_cores_ids.emplace(std::move(*cpu_ids));
|
|
}
|
|
return *logical_cores_ids;
|
|
}
|