// 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 <perftest/perftest.h>
#include <zircon/process.h>
#include <zircon/syscalls.h>

#include "src/lib/fxl/logging.h"

namespace {

bool ThreadCreateAndJoinTest() {
  zx_handle_t thread;
  constexpr char tname[] = "test thread";
  FXL_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;
  FXL_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;
  FXL_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);
  FXL_CHECK(zx_thread_start(thread, entry, stack, 0, 0) == ZX_OK);

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

  FXL_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
