| // Copyright 2018 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/channel.h> |
| #include <lib/zx/event.h> |
| #include <lib/zx/eventpair.h> |
| #include <lib/zx/fifo.h> |
| #include <lib/zx/job.h> |
| #include <lib/zx/port.h> |
| #include <lib/zx/process.h> |
| #include <lib/zx/thread.h> |
| #include <lib/zx/vmar.h> |
| #include <perftest/perftest.h> |
| |
| namespace { |
| |
| // These tests measure the times taken to create and close various types of |
| // Zircon handle. Strictly speaking, they test creating Zircon objects as |
| // well as creating handles. |
| // |
| // In each test, closing the handles is done implicitly by destructors. |
| |
| bool ChannelCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::channel handle1; |
| zx::channel handle2; |
| ZX_ASSERT(zx::channel::create(0, &handle1, &handle2) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| bool EventCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::event handle; |
| ZX_ASSERT(zx::event::create(0, &handle) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| bool EventPairCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::eventpair handle1; |
| zx::eventpair handle2; |
| ZX_ASSERT(zx::eventpair::create(0, &handle1, &handle2) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| bool FifoCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::fifo handle1; |
| zx::fifo handle2; |
| const uint32_t kElementCount = 2; |
| const uint32_t kElementSize = 2048; |
| ZX_ASSERT(zx::fifo::create(kElementCount, kElementSize, 0, &handle1, |
| &handle2) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| bool PortCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::port handle; |
| ZX_ASSERT(zx::port::create(0, &handle) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| // Note that this only creates a Zircon process object. It does not start |
| // the process. |
| bool ProcessCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::process process; |
| zx::vmar root_vmar; |
| static const char kName[] = "perftest-process"; |
| ZX_ASSERT(zx::process::create( |
| *zx::job::default_job(), kName, sizeof(kName) - 1, 0, |
| &process, &root_vmar) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| // Note that this only creates a Zircon thread object. It does not start |
| // the thread. |
| bool ThreadCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::thread handle; |
| static const char kName[] = "perftest-process"; |
| ZX_ASSERT(zx::thread::create(*zx::process::self(), kName, |
| sizeof(kName) - 1, 0, &handle) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| bool VmoCreateTest(perftest::RepeatState* state) { |
| state->DeclareStep("create"); |
| state->DeclareStep("close"); |
| while (state->KeepRunning()) { |
| zx::vmo handle; |
| const size_t kSizeInBytes = 64 * 1024; |
| ZX_ASSERT(zx::vmo::create(kSizeInBytes, 0, &handle) == ZX_OK); |
| state->NextStep(); |
| } |
| return true; |
| } |
| |
| void RegisterTests() { |
| perftest::RegisterTest("HandleCreate_Channel", ChannelCreateTest); |
| perftest::RegisterTest("HandleCreate_Event", EventCreateTest); |
| perftest::RegisterTest("HandleCreate_EventPair", EventPairCreateTest); |
| perftest::RegisterTest("HandleCreate_Fifo", FifoCreateTest); |
| perftest::RegisterTest("HandleCreate_Port", PortCreateTest); |
| perftest::RegisterTest("HandleCreate_Process", ProcessCreateTest); |
| perftest::RegisterTest("HandleCreate_Thread", ThreadCreateTest); |
| perftest::RegisterTest("HandleCreate_Vmo", VmoCreateTest); |
| } |
| PERFTEST_CTOR(RegisterTests); |
| |
| } // namespace |