// Copyright 2020 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/job_handle.h"

namespace debug_agent {

std::unique_ptr<JobHandle> JobHandle::FindJob(zx_koid_t job_koid) const {
  if (GetKoid() == job_koid)
    return Duplicate();

  for (const auto& job : GetChildJobs()) {
    if (auto found = job->FindJob(job_koid))
      return found;
  }

  return nullptr;
}

std::unique_ptr<ProcessHandle> JobHandle::FindProcess(zx_koid_t process_koid) const {
  // Search direct process descendents of this job.
  for (auto& proc : GetChildProcesses()) {
    if (proc->GetKoid() == process_koid)
      return std::move(proc);
  }

  // Recursively search child jobs.
  for (const auto& job : GetChildJobs()) {
    if (auto found = job->FindProcess(process_koid))
      return found;
  }

  return nullptr;
}

}  // namespace debug_agent
