1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <lib/zx/channel.h>
6 #include <lib/zx/event.h>
7 #include <lib/zx/eventpair.h>
8 #include <lib/zx/fifo.h>
9 #include <lib/zx/job.h>
10 #include <lib/zx/port.h>
11 #include <lib/zx/process.h>
12 #include <lib/zx/thread.h>
13 #include <lib/zx/vmar.h>
14 #include <perftest/perftest.h>
15 
16 namespace {
17 
18 // These tests measure the times taken to create and close various types of
19 // Zircon handle.  Strictly speaking, they test creating Zircon objects as
20 // well as creating handles.
21 //
22 // In each test, closing the handles is done implicitly by destructors.
23 
ChannelCreateTest(perftest::RepeatState * state)24 bool ChannelCreateTest(perftest::RepeatState* state) {
25     state->DeclareStep("create");
26     state->DeclareStep("close");
27     while (state->KeepRunning()) {
28         zx::channel handle1;
29         zx::channel handle2;
30         ZX_ASSERT(zx::channel::create(0, &handle1, &handle2) == ZX_OK);
31         state->NextStep();
32     }
33     return true;
34 }
35 
EventCreateTest(perftest::RepeatState * state)36 bool EventCreateTest(perftest::RepeatState* state) {
37     state->DeclareStep("create");
38     state->DeclareStep("close");
39     while (state->KeepRunning()) {
40         zx::event handle;
41         ZX_ASSERT(zx::event::create(0, &handle) == ZX_OK);
42         state->NextStep();
43     }
44     return true;
45 }
46 
EventPairCreateTest(perftest::RepeatState * state)47 bool EventPairCreateTest(perftest::RepeatState* state) {
48     state->DeclareStep("create");
49     state->DeclareStep("close");
50     while (state->KeepRunning()) {
51         zx::eventpair handle1;
52         zx::eventpair handle2;
53         ZX_ASSERT(zx::eventpair::create(0, &handle1, &handle2) == ZX_OK);
54         state->NextStep();
55     }
56     return true;
57 }
58 
FifoCreateTest(perftest::RepeatState * state)59 bool FifoCreateTest(perftest::RepeatState* state) {
60     state->DeclareStep("create");
61     state->DeclareStep("close");
62     while (state->KeepRunning()) {
63         zx::fifo handle1;
64         zx::fifo handle2;
65         const uint32_t kElementCount = 2;
66         const uint32_t kElementSize = 2048;
67         ZX_ASSERT(zx::fifo::create(kElementCount, kElementSize, 0, &handle1,
68                                    &handle2) == ZX_OK);
69         state->NextStep();
70     }
71     return true;
72 }
73 
PortCreateTest(perftest::RepeatState * state)74 bool PortCreateTest(perftest::RepeatState* state) {
75     state->DeclareStep("create");
76     state->DeclareStep("close");
77     while (state->KeepRunning()) {
78         zx::port handle;
79         ZX_ASSERT(zx::port::create(0, &handle) == ZX_OK);
80         state->NextStep();
81     }
82     return true;
83 }
84 
85 // Note that this only creates a Zircon process object.  It does not start
86 // the process.
ProcessCreateTest(perftest::RepeatState * state)87 bool ProcessCreateTest(perftest::RepeatState* state) {
88     state->DeclareStep("create");
89     state->DeclareStep("close");
90     while (state->KeepRunning()) {
91         zx::process process;
92         zx::vmar root_vmar;
93         static const char kName[] = "perftest-process";
94         ZX_ASSERT(zx::process::create(
95                       *zx::job::default_job(), kName, sizeof(kName) - 1, 0,
96                       &process, &root_vmar) == ZX_OK);
97         state->NextStep();
98     }
99     return true;
100 }
101 
102 // Note that this only creates a Zircon thread object.  It does not start
103 // the thread.
ThreadCreateTest(perftest::RepeatState * state)104 bool ThreadCreateTest(perftest::RepeatState* state) {
105     state->DeclareStep("create");
106     state->DeclareStep("close");
107     while (state->KeepRunning()) {
108         zx::thread handle;
109         static const char kName[] = "perftest-process";
110         ZX_ASSERT(zx::thread::create(*zx::process::self(), kName,
111                                      sizeof(kName) - 1, 0, &handle) == ZX_OK);
112         state->NextStep();
113     }
114     return true;
115 }
116 
VmoCreateTest(perftest::RepeatState * state)117 bool VmoCreateTest(perftest::RepeatState* state) {
118     state->DeclareStep("create");
119     state->DeclareStep("close");
120     while (state->KeepRunning()) {
121         zx::vmo handle;
122         const size_t kSizeInBytes = 64 * 1024;
123         ZX_ASSERT(zx::vmo::create(kSizeInBytes, 0, &handle) == ZX_OK);
124         state->NextStep();
125     }
126     return true;
127 }
128 
RegisterTests()129 void RegisterTests() {
130     perftest::RegisterTest("HandleCreate_Channel", ChannelCreateTest);
131     perftest::RegisterTest("HandleCreate_Event", EventCreateTest);
132     perftest::RegisterTest("HandleCreate_EventPair", EventPairCreateTest);
133     perftest::RegisterTest("HandleCreate_Fifo", FifoCreateTest);
134     perftest::RegisterTest("HandleCreate_Port", PortCreateTest);
135     perftest::RegisterTest("HandleCreate_Process", ProcessCreateTest);
136     perftest::RegisterTest("HandleCreate_Thread", ThreadCreateTest);
137     perftest::RegisterTest("HandleCreate_Vmo", VmoCreateTest);
138 }
139 PERFTEST_CTOR(RegisterTests);
140 
141 }  // namespace
142