blob: 8d3b989cbc2b59f9d1eaf59c1917d9d9014b8e69 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/fit/result.h>
#include <lib/inspect/cpp/inspect.h>
#include <lib/inspect/cpp/vmo/heap.h>
#include <lib/inspect/cpp/vmo/state.h>
#include <lib/inspect/cpp/vmo/types.h>
#include <sstream>
using inspect::internal::Heap;
using inspect::internal::State;
namespace inspect {
namespace {
const InspectSettings kDefaultInspectSettings = {.maximum_size = 256 * 1024};
} // namespace
Inspector::Inspector() : Inspector(kDefaultInspectSettings) {}
Inspector::Inspector(const InspectSettings& settings)
: root_(std::make_shared<Node>()),
value_list_(std::make_shared<ValueList>()),
value_mutex_(std::make_shared<std::mutex>()) {
if (settings.maximum_size == 0) {
return;
}
state_ = State::CreateWithSize(settings.maximum_size);
if (!state_) {
return;
}
*root_ = state_->CreateRootNode();
}
Inspector::Inspector(zx::vmo vmo)
: root_(std::make_shared<Node>()), value_list_(std::make_shared<ValueList>()) {
size_t size;
zx_status_t status;
if (ZX_OK != (status = vmo.get_size(&size))) {
return;
}
if (size == 0) {
// VMO cannot be zero size.
return;
}
// Decommit all pages, reducing memory usage of the VMO and zeroing it.
if (ZX_OK != (status = vmo.op_range(ZX_VMO_OP_DECOMMIT, 0, size, nullptr, 0))) {
return;
}
state_ = State::Create(std::make_unique<Heap>(std::move(vmo)));
if (!state_) {
return;
}
*root_ = state_->CreateRootNode();
}
zx::vmo Inspector::DuplicateVmo() const {
zx::vmo ret;
if (state_) {
state_->DuplicateVmo(&ret);
}
return ret;
}
zx::vmo Inspector::CopyVmo() const {
zx::vmo ret;
state_->Copy(&ret);
return ret;
}
std::vector<uint8_t> Inspector::CopyBytes() const {
std::vector<uint8_t> ret;
state_->CopyBytes(&ret);
return ret;
}
InspectStats Inspector::GetStats() const {
if (!state_) {
return InspectStats{};
}
return state_->GetStats();
}
Node& Inspector::GetRoot() const { return *root_; }
std::vector<std::string> Inspector::GetChildNames() const { return state_->GetLinkNames(); }
fit::promise<Inspector> Inspector::OpenChild(const std::string& child_name) const {
return state_->CallLinkCallback(child_name);
}
namespace internal {
std::shared_ptr<State> GetState(const Inspector* inspector) { return inspector->state_; }
} // namespace internal
} // namespace inspect