BreakpointList.cpp revision 3c7b5b9f83cae58ca366db2bba37dc09485f7dcc
1//===-- 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}
199
200void
201BreakpointList::GetListMutex (Mutex::Locker &locker)
202{
203    return locker.Reset (m_mutex.GetMutex());
204}
205