blob: 6a91bd6731a3c153035eda64a2f12ecfe889ea08 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- BreakpointList.cpp --------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Breakpoint/BreakpointList.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000016#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017
18using namespace lldb;
19using namespace lldb_private;
20
21BreakpointList::BreakpointList (bool is_internal) :
22 m_mutex (Mutex::eMutexTypeRecursive),
23 m_breakpoints(),
24 m_next_break_id (0),
25 m_is_internal (is_internal)
26{
27}
28
29BreakpointList::~BreakpointList()
30{
31}
32
33
34break_id_t
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000035BreakpointList::Add (BreakpointSP &bp_sp, bool notify)
Chris Lattner24943d22010-06-08 16:52:24 +000036{
37 Mutex::Locker locker(m_mutex);
38 // Internal breakpoint IDs are negative, normal ones are positive
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000039 bp_sp->SetID (m_is_internal ? --m_next_break_id : ++m_next_break_id);
40
41 m_breakpoints.push_back(bp_sp);
42 if (notify)
43 {
44 if (bp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
45 bp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
46 new Breakpoint::BreakpointEventData (eBreakpointEventTypeAdded, bp_sp));
47 }
48 return bp_sp->GetID();
Chris Lattner24943d22010-06-08 16:52:24 +000049}
50
51bool
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000052BreakpointList::Remove (break_id_t break_id, bool notify)
Chris Lattner24943d22010-06-08 16:52:24 +000053{
54 Mutex::Locker locker(m_mutex);
55 bp_collection::iterator pos = GetBreakpointIDIterator(break_id); // Predicate
56 if (pos != m_breakpoints.end())
57 {
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000058 BreakpointSP bp_sp (*pos);
Chris Lattner24943d22010-06-08 16:52:24 +000059 m_breakpoints.erase(pos);
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000060 if (notify)
61 {
62 if (bp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
63 bp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
64 new Breakpoint::BreakpointEventData (eBreakpointEventTypeRemoved, bp_sp));
65 }
Chris Lattner24943d22010-06-08 16:52:24 +000066 return true;
67 }
68 return false;
69}
70
71void
72BreakpointList::SetEnabledAll (bool enabled)
73{
74 Mutex::Locker locker(m_mutex);
75 bp_collection::iterator pos, end = m_breakpoints.end();
76 for (pos = m_breakpoints.begin(); pos != end; ++pos)
77 (*pos)->SetEnabled (enabled);
78}
79
80
81void
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000082BreakpointList::RemoveAll (bool notify)
Chris Lattner24943d22010-06-08 16:52:24 +000083{
84 Mutex::Locker locker(m_mutex);
85 ClearAllBreakpointSites ();
86
Greg Claytonc7f5d5c2010-07-23 23:33:17 +000087 if (notify)
88 {
89 bp_collection::iterator pos, end = m_breakpoints.end();
90 for (pos = m_breakpoints.begin(); pos != end; ++pos)
91 if ((*pos)->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
92 (*pos)->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
93 new Breakpoint::BreakpointEventData (eBreakpointEventTypeRemoved, *pos));
94 }
Chris Lattner24943d22010-06-08 16:52:24 +000095 m_breakpoints.erase (m_breakpoints.begin(), m_breakpoints.end());
96}
97
98class BreakpointIDMatches
99{
100public:
101 BreakpointIDMatches (break_id_t break_id) :
102 m_break_id(break_id)
103 {
104 }
105
106 bool operator() (const BreakpointSP &bp) const
107 {
108 return m_break_id == bp->GetID();
109 }
110
111private:
112 const break_id_t m_break_id;
113};
114
115BreakpointList::bp_collection::iterator
116BreakpointList::GetBreakpointIDIterator (break_id_t break_id)
117{
118 return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
119 BreakpointIDMatches(break_id)); // Predicate
120}
121
122BreakpointList::bp_collection::const_iterator
123BreakpointList::GetBreakpointIDConstIterator (break_id_t break_id) const
124{
125 return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
126 BreakpointIDMatches(break_id)); // Predicate
127}
128
129BreakpointSP
130BreakpointList::FindBreakpointByID (break_id_t break_id)
131{
132 Mutex::Locker locker(m_mutex);
133 BreakpointSP stop_sp;
134 bp_collection::iterator pos = GetBreakpointIDIterator(break_id);
135 if (pos != m_breakpoints.end())
136 stop_sp = *pos;
137
138 return stop_sp;
139}
140
141const BreakpointSP
142BreakpointList::FindBreakpointByID (break_id_t break_id) const
143{
144 Mutex::Locker locker(m_mutex);
145 BreakpointSP stop_sp;
146 bp_collection::const_iterator pos = GetBreakpointIDConstIterator(break_id);
147 if (pos != m_breakpoints.end())
148 stop_sp = *pos;
149
150 return stop_sp;
151}
152
153void
154BreakpointList::Dump (Stream *s) const
155{
156 Mutex::Locker locker(m_mutex);
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000157 s->Printf("%p: ", this);
Chris Lattner24943d22010-06-08 16:52:24 +0000158 s->Indent();
159 s->Printf("BreakpointList with %u Breakpoints:\n", (uint32_t)m_breakpoints.size());
160 s->IndentMore();
161 bp_collection::const_iterator pos;
162 bp_collection::const_iterator end = m_breakpoints.end();
163 for (pos = m_breakpoints.begin(); pos != end; ++pos)
164 (*pos)->Dump(s);
165 s->IndentLess();
166}
167
168
169BreakpointSP
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000170BreakpointList::GetBreakpointAtIndex (uint32_t i)
Chris Lattner24943d22010-06-08 16:52:24 +0000171{
172 Mutex::Locker locker(m_mutex);
173 BreakpointSP stop_sp;
174 bp_collection::iterator end = m_breakpoints.end();
175 bp_collection::iterator pos;
176 uint32_t curr_i = 0;
177 for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
178 {
179 if (curr_i == i)
180 stop_sp = *pos;
181 }
182 return stop_sp;
183}
184
185const BreakpointSP
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000186BreakpointList::GetBreakpointAtIndex (uint32_t i) const
Chris Lattner24943d22010-06-08 16:52:24 +0000187{
188 Mutex::Locker locker(m_mutex);
189 BreakpointSP stop_sp;
190 bp_collection::const_iterator end = m_breakpoints.end();
191 bp_collection::const_iterator pos;
192 uint32_t curr_i = 0;
193 for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
194 {
195 if (curr_i == i)
196 stop_sp = *pos;
197 }
198 return stop_sp;
199}
200
201void
202BreakpointList::UpdateBreakpoints (ModuleList& module_list, bool added)
203{
204 Mutex::Locker locker(m_mutex);
205 bp_collection::iterator end = m_breakpoints.end();
206 bp_collection::iterator pos;
207 for (pos = m_breakpoints.begin(); pos != end; ++pos)
208 (*pos)->ModulesChanged (module_list, added);
209
210}
211
212void
Jim Ingham03e5e512012-05-17 18:38:42 +0000213BreakpointList::UpdateBreakpointsWhenModuleIsReplaced (ModuleSP old_module_sp, ModuleSP new_module_sp)
214{
215 Mutex::Locker locker(m_mutex);
216 bp_collection::iterator end = m_breakpoints.end();
217 bp_collection::iterator pos;
218 for (pos = m_breakpoints.begin(); pos != end; ++pos)
219 (*pos)->ModuleReplaced (old_module_sp, new_module_sp);
220
221}
222
223void
Chris Lattner24943d22010-06-08 16:52:24 +0000224BreakpointList::ClearAllBreakpointSites ()
225{
226 Mutex::Locker locker(m_mutex);
227 bp_collection::iterator end = m_breakpoints.end();
228 bp_collection::iterator pos;
229 for (pos = m_breakpoints.begin(); pos != end; ++pos)
230 (*pos)->ClearAllBreakpointSites ();
231
232}
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000233
234void
235BreakpointList::GetListMutex (Mutex::Locker &locker)
236{
Jim Ingham1b584eb2012-05-04 23:02:50 +0000237 return locker.Lock (m_mutex);
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000238}