blob: 0d9444f7371992406373cf5d34e5fe4598406ea8 [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
16
17using namespace lldb;
18using namespace lldb_private;
19
20BreakpointList::BreakpointList (bool is_internal) :
21 m_mutex (Mutex::eMutexTypeRecursive),
22 m_breakpoints(),
23 m_next_break_id (0),
24 m_is_internal (is_internal)
25{
26}
27
28BreakpointList::~BreakpointList()
29{
30}
31
32
33break_id_t
34BreakpointList::Add (BreakpointSP &bp)
35{
36 Mutex::Locker locker(m_mutex);
37 // Internal breakpoint IDs are negative, normal ones are positive
38 bp->SetID (m_is_internal ? --m_next_break_id : ++m_next_break_id);
39 m_breakpoints.push_back(bp);
40 return bp->GetID();
41}
42
43bool
44BreakpointList::Remove (break_id_t break_id)
45{
46 Mutex::Locker locker(m_mutex);
47 bp_collection::iterator pos = GetBreakpointIDIterator(break_id); // Predicate
48 if (pos != m_breakpoints.end())
49 {
50 m_breakpoints.erase(pos);
51 return true;
52 }
53 return false;
54}
55
56void
57BreakpointList::SetEnabledAll (bool enabled)
58{
59 Mutex::Locker locker(m_mutex);
60 bp_collection::iterator pos, end = m_breakpoints.end();
61 for (pos = m_breakpoints.begin(); pos != end; ++pos)
62 (*pos)->SetEnabled (enabled);
63}
64
65
66void
67BreakpointList::RemoveAll ()
68{
69 Mutex::Locker locker(m_mutex);
70 ClearAllBreakpointSites ();
71
72 m_breakpoints.erase (m_breakpoints.begin(), m_breakpoints.end());
73}
74
75class BreakpointIDMatches
76{
77public:
78 BreakpointIDMatches (break_id_t break_id) :
79 m_break_id(break_id)
80 {
81 }
82
83 bool operator() (const BreakpointSP &bp) const
84 {
85 return m_break_id == bp->GetID();
86 }
87
88private:
89 const break_id_t m_break_id;
90};
91
92BreakpointList::bp_collection::iterator
93BreakpointList::GetBreakpointIDIterator (break_id_t break_id)
94{
95 return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
96 BreakpointIDMatches(break_id)); // Predicate
97}
98
99BreakpointList::bp_collection::const_iterator
100BreakpointList::GetBreakpointIDConstIterator (break_id_t break_id) const
101{
102 return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
103 BreakpointIDMatches(break_id)); // Predicate
104}
105
106BreakpointSP
107BreakpointList::FindBreakpointByID (break_id_t break_id)
108{
109 Mutex::Locker locker(m_mutex);
110 BreakpointSP stop_sp;
111 bp_collection::iterator pos = GetBreakpointIDIterator(break_id);
112 if (pos != m_breakpoints.end())
113 stop_sp = *pos;
114
115 return stop_sp;
116}
117
118const BreakpointSP
119BreakpointList::FindBreakpointByID (break_id_t break_id) const
120{
121 Mutex::Locker locker(m_mutex);
122 BreakpointSP stop_sp;
123 bp_collection::const_iterator pos = GetBreakpointIDConstIterator(break_id);
124 if (pos != m_breakpoints.end())
125 stop_sp = *pos;
126
127 return stop_sp;
128}
129
130void
131BreakpointList::Dump (Stream *s) const
132{
133 Mutex::Locker locker(m_mutex);
134 s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
135 s->Indent();
136 s->Printf("BreakpointList with %u Breakpoints:\n", (uint32_t)m_breakpoints.size());
137 s->IndentMore();
138 bp_collection::const_iterator pos;
139 bp_collection::const_iterator end = m_breakpoints.end();
140 for (pos = m_breakpoints.begin(); pos != end; ++pos)
141 (*pos)->Dump(s);
142 s->IndentLess();
143}
144
145
146BreakpointSP
147BreakpointList::GetBreakpointByIndex (uint32_t i)
148{
149 Mutex::Locker locker(m_mutex);
150 BreakpointSP stop_sp;
151 bp_collection::iterator end = m_breakpoints.end();
152 bp_collection::iterator pos;
153 uint32_t curr_i = 0;
154 for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
155 {
156 if (curr_i == i)
157 stop_sp = *pos;
158 }
159 return stop_sp;
160}
161
162const BreakpointSP
163BreakpointList::GetBreakpointByIndex (uint32_t i) const
164{
165 Mutex::Locker locker(m_mutex);
166 BreakpointSP stop_sp;
167 bp_collection::const_iterator end = m_breakpoints.end();
168 bp_collection::const_iterator pos;
169 uint32_t curr_i = 0;
170 for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
171 {
172 if (curr_i == i)
173 stop_sp = *pos;
174 }
175 return stop_sp;
176}
177
178void
179BreakpointList::UpdateBreakpoints (ModuleList& module_list, bool added)
180{
181 Mutex::Locker locker(m_mutex);
182 bp_collection::iterator end = m_breakpoints.end();
183 bp_collection::iterator pos;
184 for (pos = m_breakpoints.begin(); pos != end; ++pos)
185 (*pos)->ModulesChanged (module_list, added);
186
187}
188
189void
190BreakpointList::ClearAllBreakpointSites ()
191{
192 Mutex::Locker locker(m_mutex);
193 bp_collection::iterator end = m_breakpoints.end();
194 bp_collection::iterator pos;
195 for (pos = m_breakpoints.begin(); pos != end; ++pos)
196 (*pos)->ClearAllBreakpointSites ();
197
198}
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000199
200void
201BreakpointList::GetListMutex (Mutex::Locker &locker)
202{
203 return locker.Reset (m_mutex.GetMutex());
204}