blob: 54ae84dc6d6a35b53827397444444571fb48fe63 [file] [log] [blame]
// 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