| // 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 "src/developer/debug/debug_agent/system_info.h" |
| |
| #include <lib/zx/channel.h> |
| #include <lib/zx/job.h> |
| #include <lib/zx/process.h> |
| #include <unistd.h> |
| #include <zircon/syscalls.h> |
| #include <zircon/syscalls/object.h> |
| |
| #include "src/developer/debug/debug_agent/object_provider.h" |
| #include "src/lib/fxl/logging.h" |
| |
| namespace debug_agent { |
| |
| namespace { |
| |
| debug_ipc::ProcessTreeRecord GetProcessTreeRecord(const ObjectProvider& provider, |
| const zx::object_base& object, |
| debug_ipc::ProcessTreeRecord::Type type) { |
| debug_ipc::ProcessTreeRecord result; |
| result.type = type; |
| result.koid = provider.KoidForObject(object); |
| result.name = provider.NameForObject(object); |
| |
| if (type == debug_ipc::ProcessTreeRecord::Type::kJob) { |
| std::vector<zx::process> child_procs = provider.GetChildProcesses(object.get()); |
| std::vector<zx::job> child_jobs = provider.GetChildJobs(object.get()); |
| result.children.reserve(child_procs.size() + child_jobs.size()); |
| |
| for (const auto& job : child_jobs) { |
| result.children.push_back( |
| GetProcessTreeRecord(provider, job, debug_ipc::ProcessTreeRecord::Type::kJob)); |
| } |
| for (const auto& proc : child_procs) { |
| result.children.push_back( |
| GetProcessTreeRecord(provider, proc, debug_ipc::ProcessTreeRecord::Type::kProcess)); |
| } |
| } |
| return result; |
| } |
| |
| } // namespace |
| |
| zx_status_t GetProcessTree(debug_ipc::ProcessTreeRecord* root, const ObjectProvider& object_provider) { |
| *root = GetProcessTreeRecord(object_provider, object_provider.GetRootJob(), |
| debug_ipc::ProcessTreeRecord::Type::kJob); |
| return ZX_OK; |
| } |
| |
| } // namespace debug_agent |