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

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

#endif  // SRC_DEVELOPER_DEBUG_SHARED_EVENT_HANDLERS_H_
