1 //===-- BreakpointList.cpp --------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Breakpoint/BreakpointList.h"
14 // Other libraries and framework includes
16 #include "lldb/Target/Target.h"
19 using namespace lldb_private;
21 BreakpointList::BreakpointList (bool is_internal) :
22 m_mutex (Mutex::eMutexTypeRecursive),
25 m_is_internal (is_internal)
29 BreakpointList::~BreakpointList()
35 BreakpointList::Add (BreakpointSP &bp_sp, bool notify)
37 Mutex::Locker locker(m_mutex);
38 // Internal breakpoint IDs are negative, normal ones are positive
39 bp_sp->SetID (m_is_internal ? --m_next_break_id : ++m_next_break_id);
41 m_breakpoints.push_back(bp_sp);
44 if (bp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
45 bp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
46 new Breakpoint::BreakpointEventData (eBreakpointEventTypeAdded, bp_sp));
48 return bp_sp->GetID();
52 BreakpointList::Remove (break_id_t break_id, bool notify)
54 Mutex::Locker locker(m_mutex);
55 bp_collection::iterator pos = GetBreakpointIDIterator(break_id); // Predicate
56 if (pos != m_breakpoints.end())
58 BreakpointSP bp_sp (*pos);
59 m_breakpoints.erase(pos);
62 if (bp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
63 bp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
64 new Breakpoint::BreakpointEventData (eBreakpointEventTypeRemoved, bp_sp));
72 BreakpointList::RemoveInvalidLocations (const ArchSpec &arch)
74 Mutex::Locker locker(m_mutex);
75 for (const auto &bp_sp : m_breakpoints)
76 bp_sp->RemoveInvalidLocations(arch);
81 BreakpointList::SetEnabledAll (bool enabled)
83 Mutex::Locker locker(m_mutex);
84 for (const auto &bp_sp : m_breakpoints)
85 bp_sp->SetEnabled (enabled);
90 BreakpointList::RemoveAll (bool notify)
92 Mutex::Locker locker(m_mutex);
93 ClearAllBreakpointSites ();
97 bp_collection::iterator pos, end = m_breakpoints.end();
98 for (pos = m_breakpoints.begin(); pos != end; ++pos)
100 if ((*pos)->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
102 (*pos)->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
103 new Breakpoint::BreakpointEventData (eBreakpointEventTypeRemoved,
108 m_breakpoints.erase (m_breakpoints.begin(), m_breakpoints.end());
111 class BreakpointIDMatches
114 BreakpointIDMatches (break_id_t break_id) :
119 bool operator() (const BreakpointSP &bp) const
121 return m_break_id == bp->GetID();
125 const break_id_t m_break_id;
128 BreakpointList::bp_collection::iterator
129 BreakpointList::GetBreakpointIDIterator (break_id_t break_id)
131 return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
132 BreakpointIDMatches(break_id)); // Predicate
135 BreakpointList::bp_collection::const_iterator
136 BreakpointList::GetBreakpointIDConstIterator (break_id_t break_id) const
138 return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
139 BreakpointIDMatches(break_id)); // Predicate
143 BreakpointList::FindBreakpointByID (break_id_t break_id)
145 Mutex::Locker locker(m_mutex);
146 BreakpointSP stop_sp;
147 bp_collection::iterator pos = GetBreakpointIDIterator(break_id);
148 if (pos != m_breakpoints.end())
155 BreakpointList::FindBreakpointByID (break_id_t break_id) const
157 Mutex::Locker locker(m_mutex);
158 BreakpointSP stop_sp;
159 bp_collection::const_iterator pos = GetBreakpointIDConstIterator(break_id);
160 if (pos != m_breakpoints.end())
167 BreakpointList::Dump (Stream *s) const
169 Mutex::Locker locker(m_mutex);
170 s->Printf("%p: ", this);
172 s->Printf("BreakpointList with %u Breakpoints:\n", (uint32_t)m_breakpoints.size());
174 for (const auto &bp_sp : m_breakpoints)
181 BreakpointList::GetBreakpointAtIndex (size_t i)
183 Mutex::Locker locker(m_mutex);
184 BreakpointSP stop_sp;
185 bp_collection::iterator end = m_breakpoints.end();
186 bp_collection::iterator pos;
188 for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
197 BreakpointList::GetBreakpointAtIndex (size_t i) const
199 Mutex::Locker locker(m_mutex);
200 BreakpointSP stop_sp;
201 bp_collection::const_iterator end = m_breakpoints.end();
202 bp_collection::const_iterator pos;
204 for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
213 BreakpointList::UpdateBreakpoints (ModuleList& module_list, bool added, bool delete_locations)
215 Mutex::Locker locker(m_mutex);
216 for (const auto &bp_sp : m_breakpoints)
217 bp_sp->ModulesChanged (module_list, added, delete_locations);
222 BreakpointList::UpdateBreakpointsWhenModuleIsReplaced (ModuleSP old_module_sp, ModuleSP new_module_sp)
224 Mutex::Locker locker(m_mutex);
225 for (const auto &bp_sp : m_breakpoints)
226 bp_sp->ModuleReplaced (old_module_sp, new_module_sp);
231 BreakpointList::ClearAllBreakpointSites ()
233 Mutex::Locker locker(m_mutex);
234 for (const auto &bp_sp : m_breakpoints)
235 bp_sp->ClearAllBreakpointSites ();
240 BreakpointList::GetListMutex (Mutex::Locker &locker)
242 return locker.Lock (m_mutex);