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