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

#include <set>

#include <zircon/types.h>

#include "garnet/lib/debug_ipc/records.h"
#include "lib/fxl/logging.h"

namespace debug_agent {

class DebuggedProcess;
class Watchpoint;

class ProcessWatchpoint {
 public:
  ProcessWatchpoint(Watchpoint*, DebuggedProcess*,
                    const debug_ipc::AddressRange& range);
  ~ProcessWatchpoint();

  zx_status_t process_koid() const;
  DebuggedProcess* process() const { return process_; }
  const debug_ipc::AddressRange& range() const { return range_; }

  // Init should be called immediately after construction.
  // If this fails, the process breakpoint is invalid and should not be used.
  zx_status_t Init();

  // Update will look at the settings on the associated Watchpoint and update
  // the HW installations accordingly, removing those threads no longer tracked
  // and adding those that now are.
  //
  // This should be called whenever the associated watchpoint is updated or
  // removed.
  zx_status_t Update();

 private:
  // Force uninstallation of the HW watchpoint for all installed threads.
  void Uninstall();

  // A Process Watchpoint is only related to one abstract watchpoint.
  // This is because watchpoint will differ in range most frequently and having
  // them be merged when possible is more trouble than it's worth.
  Watchpoint* watchpoint_ = nullptr;     // Not-owning.

  // The process this watchpoint is installed on.
  DebuggedProcess* process_ = nullptr;  // Not-owning.

  // The span of addresses this
  debug_ipc::AddressRange range_ = {};

  // List of threads that currently have HW watchpoints installed.
  std::set<zx_koid_t> installed_threads_ = {};

  FXL_DISALLOW_COPY_AND_ASSIGN(ProcessWatchpoint);
};

}  // namespace debug_agent
