// 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/async-loop/cpp/loop.h>

#include <zircon/assert.h>

namespace async {

Loop::Loop(const async_loop_config_t* config) {
  zx_status_t status = async_loop_create(config, &loop_);
  ZX_ASSERT_MSG(status == ZX_OK, "status=%d", status);
}

Loop::~Loop() { async_loop_destroy(loop_); }

void Loop::Shutdown() { async_loop_shutdown(loop_); }

zx_status_t Loop::Run(zx::time deadline, bool once) {
  return async_loop_run(loop_, deadline.get(), once);
}

zx_status_t Loop::RunUntilIdle() { return async_loop_run_until_idle(loop_); }

void Loop::Quit() { async_loop_quit(loop_); }

zx_status_t Loop::ResetQuit() { return async_loop_reset_quit(loop_); }

async_loop_state_t Loop::GetState() const { return async_loop_get_state(loop_); }

zx_status_t Loop::StartThread(const char* name, thrd_t* out_thread) {
  return async_loop_start_thread(loop_, name, out_thread);
}

void Loop::JoinThreads() { async_loop_join_threads(loop_); }

}  // namespace async
