1ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen//===-- WatchpointList.cpp --------------------------------------*- C++ -*-===// 2ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// 3ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// The LLVM Compiler Infrastructure 4ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// 5ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// This file is distributed under the University of Illinois Open Source 6ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// License. See LICENSE.TXT for details. 7ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// 8ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen//===----------------------------------------------------------------------===// 9ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 10ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 11ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// C Includes 12ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// C++ Includes 13ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// Other libraries and framework includes 14ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen// Project includes 15ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen#include "lldb/Breakpoint/WatchpointList.h" 16ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen#include "lldb/Breakpoint/Watchpoint.h" 17ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 18ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenusing namespace lldb; 19ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenusing namespace lldb_private; 20ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 21ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::WatchpointList() : 22116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen m_watchpoints (), 23116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen m_mutex (Mutex::eMutexTypeRecursive), 24116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen m_next_wp_id (0) 25ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 26ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 27ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 28ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::~WatchpointList() 29ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 30ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 31ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 32116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen// Add a watchpoint to the list. 33ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenlldb::watch_id_t 349c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpointList::Add (const WatchpointSP &wp_sp, bool notify) 35ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 36ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 37116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_sp->SetID(++m_next_wp_id); 38116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen m_watchpoints.push_back(wp_sp); 399c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham if (notify) 409c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham { 419c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham if (wp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitWatchpointChanged)) 429c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham wp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitWatchpointChanged, 439c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham new Watchpoint::WatchpointEventData (eWatchpointEventTypeAdded, wp_sp)); 449c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham } 45ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return wp_sp->GetID(); 46ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 47ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 48ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenvoid 49ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::Dump (Stream *s) const 50ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 51ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen DumpWithLevel(s, lldb::eDescriptionLevelBrief); 52ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 53ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 54ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenvoid 55ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::DumpWithLevel (Stream *s, lldb::DescriptionLevel description_level) const 56ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 57ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 58ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen s->Printf("%p: ", this); 59ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen //s->Indent(); 605f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf("WatchpointList with %" PRIu64 " Watchpoints:\n", 61851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton (uint64_t)m_watchpoints.size()); 62ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen s->IndentMore(); 63116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos, end = m_watchpoints.end(); 64116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen for (pos = m_watchpoints.begin(); pos != end; ++pos) 65116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen (*pos)->DumpWithLevel(s, description_level); 66ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen s->IndentLess(); 67ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 68ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 69ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenconst WatchpointSP 70ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::FindByAddress (lldb::addr_t addr) const 71ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 72ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen WatchpointSP wp_sp; 73ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 74116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if (!m_watchpoints.empty()) 75116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen { 76116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos, end = m_watchpoints.end(); 77116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen for (pos = m_watchpoints.begin(); pos != end; ++pos) 78116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if ((*pos)->GetLoadAddress() == addr) { 79116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_sp = *pos; 80116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen break; 81116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen } 82116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen } 83116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen 84116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen return wp_sp; 85116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen} 86116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen 87116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chenconst WatchpointSP 88116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny ChenWatchpointList::FindBySpec (std::string spec) const 89116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen{ 90116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen WatchpointSP wp_sp; 91116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen Mutex::Locker locker (m_mutex); 92116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if (!m_watchpoints.empty()) 93ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 94116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos, end = m_watchpoints.end(); 95116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen for (pos = m_watchpoints.begin(); pos != end; ++pos) 96116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if ((*pos)->GetWatchSpec() == spec) { 97116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_sp = *pos; 98116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen break; 99116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen } 100ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 101ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 102ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return wp_sp; 103ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 104ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 105ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenclass WatchpointIDMatches 106ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 107ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenpublic: 108ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen WatchpointIDMatches (lldb::watch_id_t watch_id) : 109ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen m_watch_id(watch_id) 110ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 111ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 112ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 113116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen bool operator() (const WatchpointSP &wp) const 114ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 115116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen return m_watch_id == wp->GetID(); 116ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 117ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 118ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenprivate: 119ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen const lldb::watch_id_t m_watch_id; 120ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen}; 121ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 122116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny ChenWatchpointList::wp_collection::iterator 123ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::GetIDIterator (lldb::watch_id_t watch_id) 124ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 125116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen return std::find_if(m_watchpoints.begin(), m_watchpoints.end(), // Search full range 126116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen WatchpointIDMatches(watch_id)); // Predicate 127ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 128ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 129116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny ChenWatchpointList::wp_collection::const_iterator 130ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::GetIDConstIterator (lldb::watch_id_t watch_id) const 131ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 132116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen return std::find_if(m_watchpoints.begin(), m_watchpoints.end(), // Search full range 133116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen WatchpointIDMatches(watch_id)); // Predicate 134ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 135ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 136ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointSP 137ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::FindByID (lldb::watch_id_t watch_id) const 138ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 139ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen WatchpointSP wp_sp; 140ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 141116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos = GetIDConstIterator(watch_id); 142116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if (pos != m_watchpoints.end()) 143116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_sp = *pos; 144ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 145ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return wp_sp; 146ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 147ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 148ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenlldb::watch_id_t 149ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::FindIDByAddress (lldb::addr_t addr) 150ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 151ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen WatchpointSP wp_sp = FindByAddress (addr); 152ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen if (wp_sp) 153ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 154ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return wp_sp->GetID(); 155ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 156ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return LLDB_INVALID_WATCH_ID; 157ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 158ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 159116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chenlldb::watch_id_t 160116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny ChenWatchpointList::FindIDBySpec (std::string spec) 161116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen{ 162116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen WatchpointSP wp_sp = FindBySpec (spec); 163116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if (wp_sp) 164116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen { 165116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen return wp_sp->GetID(); 166116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen } 167116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen return LLDB_INVALID_WATCH_ID; 168116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen} 169116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen 170ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointSP 171ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::GetByIndex (uint32_t i) 172ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 173ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 174ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen WatchpointSP wp_sp; 175116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if (i < m_watchpoints.size()) 176ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 177116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos = m_watchpoints.begin(); 178ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen std::advance(pos, i); 179116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_sp = *pos; 180ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 181ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return wp_sp; 182ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 183ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 184ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenconst WatchpointSP 185ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::GetByIndex (uint32_t i) const 186ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 187ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 188ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen WatchpointSP wp_sp; 189116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if (i < m_watchpoints.size()) 190ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 191116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos = m_watchpoints.begin(); 192ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen std::advance(pos, i); 193116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_sp = *pos; 194ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 195ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return wp_sp; 196ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 197ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 198116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chenstd::vector<lldb::watch_id_t> 199116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny ChenWatchpointList::GetWatchpointIDs() const 200116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen{ 201116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen std::vector<lldb::watch_id_t> IDs; 202116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos, end = m_watchpoints.end(); 203116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen for (pos = m_watchpoints.begin(); pos != end; ++pos) 204116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen IDs.push_back((*pos)->GetID()); 205116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen return IDs; 206116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen} 207116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen 208ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenbool 2099c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpointList::Remove (lldb::watch_id_t watch_id, bool notify) 210ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 211ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 212116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::iterator pos = GetIDIterator(watch_id); 213116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen if (pos != m_watchpoints.end()) 214ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 2159c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham WatchpointSP wp_sp = *pos; 2169c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham if (notify) 2179c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham { 2189c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham if (wp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitWatchpointChanged)) 2199c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham wp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitWatchpointChanged, 2209c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham new Watchpoint::WatchpointEventData (eWatchpointEventTypeRemoved, wp_sp)); 2219c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham } 222116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen m_watchpoints.erase(pos); 223ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return true; 224ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 225ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return false; 226ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 227ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 228ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenuint32_t 229ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::GetHitCount () const 230ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 231ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen uint32_t hit_count = 0; 232ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 233116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::const_iterator pos, end = m_watchpoints.end(); 234116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen for (pos = m_watchpoints.begin(); pos != end; ++pos) 235116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen hit_count += (*pos)->GetHitCount(); 236ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return hit_count; 237ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 238ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 239ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenbool 240ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::ShouldStop (StoppointCallbackContext *context, lldb::watch_id_t watch_id) 241ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 242ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 243ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen WatchpointSP wp_sp = FindByID (watch_id); 244ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen if (wp_sp) 245ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 246ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen // Let the Watchpoint decide if it should stop here (could not have 247ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen // reached it's target hit count yet, or it could have a callback 248ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen // that decided it shouldn't stop. 249ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return wp_sp->ShouldStop (context); 250ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 251ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen // We should stop here since this Watchpoint isn't valid anymore or it 252ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen // doesn't exist. 253ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen return true; 254ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 255ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 256ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenvoid 257ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::GetDescription (Stream *s, lldb::DescriptionLevel level) 258ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 259ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker (m_mutex); 260116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::iterator pos, end = m_watchpoints.end(); 261ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 262116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen for (pos = m_watchpoints.begin(); pos != end; ++pos) 263ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 264ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen s->Printf(" "); 265116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen (*pos)->Dump(s); 266ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen } 267ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 268ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 269ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenvoid 270ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::SetEnabledAll (bool enabled) 271ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 272ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker(m_mutex); 273ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 274116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen wp_collection::iterator pos, end = m_watchpoints.end(); 275116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen for (pos = m_watchpoints.begin(); pos != end; ++pos) 276116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen (*pos)->SetEnabled (enabled); 277ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 278ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 279ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenvoid 2809c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpointList::RemoveAll (bool notify) 281ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 282ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen Mutex::Locker locker(m_mutex); 2839c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham if (notify) 2849c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham { 2859c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham 2869c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham { 2879c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham wp_collection::iterator pos, end = m_watchpoints.end(); 2889c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham for (pos = m_watchpoints.begin(); pos != end; ++pos) 2899c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham { 2909c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham if ((*pos)->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged)) 2919c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham { 2929c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham (*pos)->GetTarget().BroadcastEvent (Target::eBroadcastBitWatchpointChanged, 2939c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham new Watchpoint::WatchpointEventData (eWatchpointEventTypeRemoved, 2949c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham *pos)); 2959c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham } 2969c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham } 2979c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham } 2989c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham } 299116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen m_watchpoints.clear(); 300ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 301ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen 302ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chenvoid 303ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpointList::GetListMutex (Mutex::Locker &locker) 304ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen{ 3051b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham return locker.Lock (m_mutex); 306ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen} 307