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

#ifndef SRC_DEVELOPER_DEBUG_SHARED_EVENT_HANDLERS_H_
#define SRC_DEVELOPER_DEBUG_SHARED_EVENT_HANDLERS_H_

#include <lib/async/cpp/wait.h>
#include <lib/zx/channel.h>

#include <memory>

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

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

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;

// Function called when a SignalHandler gets a signal it's waiting for.
using SignalHandlerFunc = void (*)(async_dispatcher_t*, async_wait_t*, zx_status_t,
                                   const zx_packet_signal_t*);

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:
  int watch_info_id_ = -1;
  std::unique_ptr<async_wait_t> handle_;
};

// This is the exception handler that uses exception token instead of the deprecated exception
// ports.
class ChannelExceptionHandler {
 public:
  static void Handler(async_dispatcher_t*, async_wait_t*, zx_status_t, const zx_packet_signal_t*);

  ChannelExceptionHandler();
  ~ChannelExceptionHandler();

  ChannelExceptionHandler(ChannelExceptionHandler&&);
  ChannelExceptionHandler& operator=(ChannelExceptionHandler&&);

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

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

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

  zx::channel exception_channel_;

  FXL_DISALLOW_COPY_AND_ASSIGN(ChannelExceptionHandler);
};

}  // namespace debug_ipc

#endif  // SRC_DEVELOPER_DEBUG_SHARED_EVENT_HANDLERS_H_
