blob: 0d64f8c71f7e19886543ec01c5fa7ffe2316b4a2 [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 <benchmark/benchmark.h>
#include <zircon/syscalls.h>
class Event : public benchmark::Fixture {
private:
void SetUp(benchmark::State& state) override {
if (zx_event_create(0, &event) != ZX_OK) {
state.SkipWithError("Failed to create channel");
}
}
void TearDown(benchmark::State& state) override {
zx_handle_close(event);
}
protected:
zx_handle_t event;
};
BENCHMARK_F(Event, Create)(benchmark::State& state) {
while (state.KeepRunning()) {
state.PauseTiming();
zx_handle_close(event);
state.ResumeTiming();
if (zx_event_create(0, &event) != ZX_OK) {
state.SkipWithError("Failed to create event");
return;
}
}
}
BENCHMARK_F(Event, Close)(benchmark::State& state) {
while (state.KeepRunning()) {
if (zx_handle_close(event) != ZX_OK) {
state.SkipWithError("Failed to close event");
return;
}
state.PauseTiming();
if (zx_event_create(0, &event) != ZX_OK) {
state.SkipWithError("Failed to create event");
}
state.ResumeTiming();
}
}
BENCHMARK_F(Event, Signal)(benchmark::State& state) {
while (state.KeepRunning()) {
if (zx_object_signal(event, 0, 0) != 0) {
state.SkipWithError("Failed to signal event");
return;
}
}
}
BENCHMARK_F(Event, Duplicate)(benchmark::State& state) {
zx_handle_t dup_event;
while (state.KeepRunning()) {
if (zx_handle_duplicate(event, ZX_RIGHT_SAME_RIGHTS, &dup_event) != 0) {
state.SkipWithError("Failed to duplicate event");
return;
}
state.PauseTiming();
zx_handle_close(dup_event);
state.ResumeTiming();
}
}
BENCHMARK_F(Event, Replace)(benchmark::State& state) {
zx_handle_t dup_event;
zx_handle_t replaced_event;
while (state.KeepRunning()) {
state.PauseTiming();
if (zx_handle_duplicate(event, ZX_RIGHT_SAME_RIGHTS, &dup_event) != 0) {
state.SkipWithError("Failed to duplicate event");
return;
}
state.ResumeTiming();
if (zx_handle_replace(dup_event, ZX_RIGHT_SAME_RIGHTS, &replaced_event) != 0) {
zx_handle_close(dup_event);
state.SkipWithError("Failed to replace event");
return;
}
state.PauseTiming();
zx_handle_close(replaced_event);
state.ResumeTiming();
}
}
class WaitItems : public benchmark::Fixture {
private:
void SetUp(benchmark::State& state) override {
for (size_t i = 0; i < num_items; i++) {
if (zx_event_create(0, &(items[i].handle)) != 0) {
state.SkipWithError("Failed to create event");
return;
}
items[i].waitfor = ZX_EVENT_SIGNALED;
}
}
void TearDown(benchmark::State& state) override {
for (size_t i = 0; i < num_items; i++) {
zx_handle_close(items[i].handle);
}
}
protected:
static constexpr size_t num_items = 4u;
zx_wait_item_t items[num_items];
};
BENCHMARK_F(WaitItems, WaitForAlreadySignaledEvent)(benchmark::State& state) {
if (zx_object_signal(items[0].handle, 0u, ZX_EVENT_SIGNALED) != 0) {
state.SkipWithError("Failed to signal event");
return;
}
while (state.KeepRunning()) {
zx_signals_t pending = 0;
if (zx_object_wait_one(items[0].handle, ZX_EVENT_SIGNALED, 0u, &pending) != 0) {
state.SkipWithError("Failed to get signaled event");
return;
}
}
}
BENCHMARK_F(WaitItems, WaitForManyWithAlreadySignaledEvent)(benchmark::State& state) {
if (zx_object_signal(items[0].handle, 0u, ZX_EVENT_SIGNALED) != 0) {
state.SkipWithError("Failed to signal event");
return;
}
while (state.KeepRunning()) {
if (zx_object_wait_many(items, num_items, 0u) != 0) {
state.SkipWithError("Failed to get signaled event");
return;
}
}
}
class EventPair : public benchmark::Fixture {};
BENCHMARK_F(EventPair, Create)(benchmark::State& state) {
zx_handle_t out0;
zx_handle_t out1;
while (state.KeepRunning()) {
if (zx_eventpair_create(0, &out0, &out1) != ZX_OK) {
state.SkipWithError("Failed to create event pair");
return;
}
state.PauseTiming();
zx_handle_close(out0);
zx_handle_close(out1);
state.ResumeTiming();
}
}