// Copyright 2016 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/zx/job.h>
#include <lib/zx/process.h>
#include <lib/zx/thread.h>
#include <lib/zx/vmar.h>
#include <zircon/syscalls.h>

namespace zx {

zx_status_t process::create(const job& job, const char* name, uint32_t name_len, uint32_t flags,
                            process* proc, vmar* vmar) {
  // Assume |proc|, |vmar| and |job| must refer to different containers, due
  // to strict aliasing.
  return zx_process_create(job.get(), name, name_len, flags, proc->reset_and_get_address(),
                           vmar->reset_and_get_address());
}

zx_status_t process::start(const thread& thread_handle, uintptr_t entry, uintptr_t stack,
                           handle arg_handle, uintptr_t arg2) const {
  return zx_process_start(get(), thread_handle.get(), entry, stack, arg_handle.release(), arg2);
}

zx_status_t process::get_child(uint64_t koid, zx_rights_t rights, thread* result) const {
  // Assume |result| and |this| are distinct containers, due to strict
  // aliasing.
  return zx_object_get_child(value_, koid, rights, result->reset_and_get_address());
}

}  // namespace zx
