blob: 0e6c5fab877895c96bab048ec5d7d5e13a96af10 [file] [log] [blame]
//===-- WatchpointResourceList.h --------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_BREAKPOINT_WATCHPOINTRESOURCELIST_H
#define LLDB_BREAKPOINT_WATCHPOINTRESOURCELIST_H
#include "lldb/Utility/Iterable.h"
#include "lldb/lldb-private.h"
#include "lldb/lldb-public.h"
#include <mutex>
#include <vector>
namespace lldb_private {
class WatchpointResourceList {
public:
WatchpointResourceList();
~WatchpointResourceList();
/// Add a WatchpointResource to the list.
///
/// \param[in] wp_res_sp
/// A shared pointer to a breakpoint site being added to the list.
///
/// \return
/// The ID of the BreakpointSite in the list.
lldb::wp_resource_id_t Add(const lldb::WatchpointResourceSP &wp_res_sp);
/// Removes the watchpoint resource given by \a id from this list.
///
/// \param[in] id
/// The watchpoint resource to remove.
///
/// \result
/// \b true if the watchpoint resource \a id was in the list.
bool Remove(lldb::wp_resource_id_t id);
/// Removes the watchpoint resource containing address \a addr from this list.
///
/// \param[in] addr
/// The address from which to remove a watchpoint resource.
///
/// \result
/// \b true if \a addr had a watchpoint resource to remove from the list.
bool RemoveByAddress(lldb::addr_t addr);
/// Returns a shared pointer to the watchpoint resource which contains
/// \a addr.
///
/// \param[in] addr
/// The address to look for.
///
/// \result
/// A shared pointer to the watchpoint resource. May contain a nullptr
/// pointer if no watchpoint site exists with a matching address.
lldb::WatchpointResourceSP FindByAddress(lldb::addr_t addr);
/// Returns a shared pointer to the watchpoint resource which is owned
/// by \a wp_sp.
///
/// \param[in] wp_sp
/// The WatchpointSP to look for.
///
/// \result
/// A shared pointer to the watchpoint resource. May contain a nullptr
/// pointer if no watchpoint site exists
lldb::WatchpointResourceSP FindByWatchpointSP(lldb::WatchpointSP &wp_sp);
/// Returns a shared pointer to the watchpoint resource which is owned
/// by \a wp.
///
/// \param[in] wp
/// The Watchpoint to look for.
///
/// \result
/// A shared pointer to the watchpoint resource. May contain a nullptr
/// pointer if no watchpoint site exists
lldb::WatchpointResourceSP
FindByWatchpoint(const lldb_private::Watchpoint *wp);
/// Returns a shared pointer to the watchpoint resource which has hardware
/// index \a id. Some Process plugins may not have access to the actual
/// hardware watchpoint register number used for a WatchpointResource, so
/// the wp_resource_id_t may not be correctly tracking the target's wp
/// register target.
///
/// \param[in] id
/// The hardware resource index to search for.
///
/// \result
/// A shared pointer to the watchpoint resource. May contain a nullptr
/// pointer if no watchpoint site exists with a matching id.
lldb::WatchpointResourceSP FindByID(lldb::wp_resource_id_t id);
///
/// Get the number of WatchpointResources that are available.
///
/// \return
/// The number of WatchpointResources that are stored in the
/// WatchpointResourceList.
uint32_t GetSize();
/// Get the WatchpointResource at a given index.
///
/// \param [in] idx
/// The index of the resource.
/// \return
/// The WatchpointResource at that index number.
lldb::WatchpointResourceSP GetResourceAtIndex(uint32_t idx);
typedef std::vector<lldb::WatchpointResourceSP> collection;
typedef LockingAdaptedIterable<collection, lldb::WatchpointResourceSP,
vector_adapter, std::mutex>
WatchpointResourceIterable;
/// Iterate over the list of WatchpointResources.
///
/// \return
/// An Iterable object which can be used to loop over the resources
/// that exist.
WatchpointResourceIterable Resources() {
return WatchpointResourceIterable(m_resources, m_mutex);
}
/// Clear out the list of resources from the WatchpointResourceList
void Clear();
std::mutex &GetMutex();
private:
collection m_resources;
std::mutex m_mutex;
};
} // namespace lldb_private
#endif // LLDB_BREAKPOINT_WATCHPOINTRESOURCELIST_H