// Copyright 2017 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/syslog/cpp/macros.h>
#include <zircon/process.h>
#include <zircon/syscalls.h>

#include <perftest/perftest.h>

namespace {

bool ThreadCreateAndJoinTest() {
  zx_handle_t thread;
  constexpr char tname[] = "test thread";
  FX_CHECK(zx_thread_create(zx_process_self(), tname, sizeof(tname), 0, &thread) == ZX_OK);

  uint64_t stack_size = 16 * 1024u;
  zx_handle_t stack_vmo;
  FX_CHECK(zx_vmo_create(stack_size, 0, &stack_vmo) == ZX_OK);

  zx_handle_t vmar = zx_vmar_root_self();
  zx_vaddr_t stack_base;
  zx_vm_option_t perm = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE;
  FX_CHECK(zx_vmar_map(vmar, perm, 0, stack_vmo, 0, stack_size, &stack_base) == ZX_OK);

  uintptr_t entry = reinterpret_cast<uintptr_t>(&zx_thread_exit);
  uintptr_t stack = reinterpret_cast<uintptr_t>(stack_base + stack_size);
  FX_CHECK(zx_thread_start(thread, entry, stack, 0, 0) == ZX_OK);

  zx_signals_t observed;
  FX_CHECK(zx_object_wait_one(thread, ZX_THREAD_TERMINATED, ZX_TIME_INFINITE, &observed) == ZX_OK);

  FX_CHECK(zx_vmar_unmap(vmar, stack_base, stack_size) == ZX_OK);

  zx_handle_close(thread);
  zx_handle_close(stack_vmo);
  return true;
}

void RegisterTests() {
  perftest::RegisterSimpleTest<ThreadCreateAndJoinTest>("Thread/CreateAndJoin");
}
PERFTEST_CTOR(RegisterTests)

}  // namespace
