// Copyright 2019 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 <zircon/errors.h>
#include <zircon/syscalls.h>
#include <zircon/types.h>

#include <perftest/perftest.h>

#include "zircon/syscalls/port.h"

namespace {

bool ObjectWaitAsyncTest(perftest::RepeatState* state) {
  state->DeclareStep("CreateEvent");
  state->DeclareStep("CreatePort");
  state->DeclareStep("ObjectWaitAsync");
  state->DeclareStep("Close");

  zx_handle_t event;
  zx_handle_t port;
  while (state->KeepRunning()) {
    zx_status_t status = zx_event_create(0u, &event);
    ZX_ASSERT(status == ZX_OK);
    state->NextStep();

    status = zx_port_create(0, &port);
    ZX_ASSERT(status == ZX_OK);
    state->NextStep();

    status = zx_object_wait_async(event, port, 0, ZX_EVENT_SIGNALED, 0);
    ZX_ASSERT(status == ZX_OK);
    state->NextStep();

    status = zx_handle_close(event);
    ZX_ASSERT(status == ZX_OK);
    status = zx_handle_close(port);
    ZX_ASSERT(status == ZX_OK);
  }

  return true;
}

void RegisterTests() { perftest::RegisterTest("ObjectWaitAsync", ObjectWaitAsyncTest); }
PERFTEST_CTOR(RegisterTests)

}  // namespace
