//===-- WatchpointResourceList.cpp ----------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "lldb/Breakpoint/WatchpointResourceList.h" #include "lldb/Breakpoint/WatchpointResource.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" using namespace lldb; using namespace lldb_private; WatchpointResourceList::WatchpointResourceList() : m_resources(), m_mutex() {} WatchpointResourceList::~WatchpointResourceList() { Clear(); } wp_resource_id_t WatchpointResourceList::Add(const WatchpointResourceSP &wp_res_sp) { Log *log = GetLog(LLDBLog::Watchpoints); std::lock_guard guard(m_mutex); LLDB_LOGF(log, "WatchpointResourceList::Add(addr 0x%" PRIx64 " size %zu)", wp_res_sp->GetLoadAddress(), wp_res_sp->GetByteSize()); m_resources.push_back(wp_res_sp); return wp_res_sp->GetID(); } bool WatchpointResourceList::Remove(wp_resource_id_t id) { std::lock_guard guard(m_mutex); Log *log = GetLog(LLDBLog::Watchpoints); for (collection::iterator pos = m_resources.begin(); pos != m_resources.end(); ++pos) { if ((*pos)->GetID() == id) { LLDB_LOGF(log, "WatchpointResourceList::Remove(addr 0x%" PRIx64 " size %zu)", (*pos)->GetLoadAddress(), (*pos)->GetByteSize()); m_resources.erase(pos); return true; } } return false; } bool WatchpointResourceList::RemoveByAddress(addr_t addr) { std::lock_guard guard(m_mutex); Log *log = GetLog(LLDBLog::Watchpoints); for (collection::iterator pos = m_resources.begin(); pos != m_resources.end(); ++pos) { if ((*pos)->Contains(addr)) { LLDB_LOGF(log, "WatchpointResourceList::RemoveByAddress(addr 0x%" PRIx64 " size %zu)", (*pos)->GetLoadAddress(), (*pos)->GetByteSize()); m_resources.erase(pos); return true; } } return false; } WatchpointResourceSP WatchpointResourceList::FindByAddress(addr_t addr) { std::lock_guard guard(m_mutex); for (WatchpointResourceSP wp_res_sp : m_resources) if (wp_res_sp->Contains(addr)) return wp_res_sp; return {}; } WatchpointResourceSP WatchpointResourceList::FindByWatchpointSP(WatchpointSP &wp_sp) { return FindByWatchpoint(wp_sp.get()); } WatchpointResourceSP WatchpointResourceList::FindByWatchpoint(const Watchpoint *wp) { std::lock_guard guard(m_mutex); for (WatchpointResourceSP wp_res_sp : m_resources) if (wp_res_sp->ConstituentsContains(wp)) return wp_res_sp; return {}; } WatchpointResourceSP WatchpointResourceList::FindByID(wp_resource_id_t id) { std::lock_guard guard(m_mutex); for (WatchpointResourceSP wp_res_sp : m_resources) if (wp_res_sp->GetID() == id) return wp_res_sp; return {}; } uint32_t WatchpointResourceList::GetSize() { std::lock_guard guard(m_mutex); return m_resources.size(); } lldb::WatchpointResourceSP WatchpointResourceList::GetResourceAtIndex(uint32_t idx) { std::lock_guard guard(m_mutex); if (idx < m_resources.size()) return m_resources[idx]; return {}; } void WatchpointResourceList::Clear() { std::lock_guard guard(m_mutex); m_resources.clear(); } std::mutex &WatchpointResourceList::GetMutex() { return m_mutex; }