// 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.

#pragma once

#include <memory>

#include <lib/async/cpp/exception.h>
#include <lib/async/cpp/wait.h>

#include "src/lib/fxl/macros.h"

namespace debug_ipc {

enum class WatchType : uint32_t;

// This signal on the task_event_ indicates there is work to do.
constexpr uint32_t kTaskSignal = ZX_USER_SIGNAL_0;

// 0 is an invalid ID for watchers, so is safe to use here.
constexpr uint64_t kTaskSignalKey = 0;

// Group of classes dedicated at handling async events associated with zircon's
// message loop.

class SignalHandler {
 public:
  static void Handler(async_dispatcher_t*, async_wait_t*, zx_status_t,
                      const zx_packet_signal_t*);

  SignalHandler();
  ~SignalHandler();

  FXL_DISALLOW_COPY_AND_ASSIGN(SignalHandler);
  SignalHandler(SignalHandler&&);
  SignalHandler& operator=(SignalHandler&&);

  zx_status_t Init(int id, zx_handle_t object, zx_signals_t signals);

  int watch_info_id() const { return watch_info_id_; }
  const async_wait_t* handle() const { return handle_.get(); }

 private:
  zx_status_t WaitForSignals() const;

  int watch_info_id_ = -1;
  std::unique_ptr<async_wait_t> handle_;
};

class ExceptionHandler {
 public:
  static void Handler(async_dispatcher_t*, async_exception_t*,
                      zx_status_t status, const zx_port_packet_t* packet);

  ExceptionHandler();
  ~ExceptionHandler();

  FXL_DISALLOW_COPY_AND_ASSIGN(ExceptionHandler);
  ExceptionHandler(ExceptionHandler&&);
  ExceptionHandler& operator=(ExceptionHandler&&);

  zx_status_t Init(int id, zx_handle_t object, uint32_t options);

  int watch_info_id() const { return watch_info_id_; }
  const async_exception_t* handle() const { return handle_.get(); }

 private:
  int watch_info_id_ = -1;
  std::unique_ptr<async_exception_t> handle_;
};

}  // namespace debug_ipc
