aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/Breakpoint/BreakpointList.h
blob: 97eb2b46bc0c436086759586a030b522bb0f0d45 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
//===-- BreakpointList.h ----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_BreakpointList_h_
#define liblldb_BreakpointList_h_

// C Includes
// C++ Includes
#include <list>
// Other libraries and framework includes
// Project includes
#include "lldb/Breakpoint/Breakpoint.h"
#include "lldb/Host/Mutex.h"

namespace lldb_private {

//----------------------------------------------------------------------
/// @class BreakpointList BreakpointList.h "lldb/Breakpoint/BreakpointList.h"
/// @brief This class manages a list of breakpoints.
//----------------------------------------------------------------------

//----------------------------------------------------------------------
/// General Outline:
/// Allows adding and removing breakpoints and find by ID and index.
//----------------------------------------------------------------------

class BreakpointList
{
public:
    BreakpointList (bool is_internal);

    ~BreakpointList();

    //------------------------------------------------------------------
    /// Add the breakpoint \a bp_sp to the list.
    ///
    /// @param[in] bp_sp
    ///   Shared pointer to the breakpoint that will get added to the list.
    ///
    /// @result
    ///   Returns breakpoint id.
    //------------------------------------------------------------------
    lldb::break_id_t
    Add (lldb::BreakpointSP& bp_sp, bool notify);

    //------------------------------------------------------------------
    /// Standard "Dump" method.  At present it does nothing.
    //------------------------------------------------------------------
    void
    Dump (Stream *s) const;

    //------------------------------------------------------------------
    /// Returns a shared pointer to the breakpoint with id \a breakID.
    ///
    /// @param[in] breakID
    ///   The breakpoint ID to seek for.
    ///
    /// @result
    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
    ///   breakpoint doesn't exist.
    //------------------------------------------------------------------
    lldb::BreakpointSP
    FindBreakpointByID (lldb::break_id_t breakID);

    //------------------------------------------------------------------
    /// Returns a shared pointer to the breakpoint with id \a breakID.  Const version.
    ///
    /// @param[in] breakID
    ///   The breakpoint ID to seek for.
    ///
    /// @result
    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
    ///   breakpoint doesn't exist.
    //------------------------------------------------------------------
    const lldb::BreakpointSP
    FindBreakpointByID (lldb::break_id_t breakID) const;

    //------------------------------------------------------------------
    /// Returns a shared pointer to the breakpoint with index \a i.
    ///
    /// @param[in] i
    ///   The breakpoint index to seek for.
    ///
    /// @result
    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
    ///   breakpoint doesn't exist.
    //------------------------------------------------------------------
    lldb::BreakpointSP
    GetBreakpointAtIndex (size_t i);

    //------------------------------------------------------------------
    /// Returns a shared pointer to the breakpoint with index \a i, const version
    ///
    /// @param[in] i
    ///   The breakpoint index to seek for.
    ///
    /// @result
    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
    ///   breakpoint doesn't exist.
    //------------------------------------------------------------------
    const lldb::BreakpointSP
    GetBreakpointAtIndex (size_t i) const;

    //------------------------------------------------------------------
    /// Returns the number of elements in this breakpoint list.
    ///
    /// @result
    ///   The number of elements.
    //------------------------------------------------------------------
    size_t
    GetSize() const 
    {
        Mutex::Locker locker(m_mutex);
        return m_breakpoints.size(); 
    }

    //------------------------------------------------------------------
    /// Removes the breakpoint given by \b breakID from this list.
    ///
    /// @param[in] breakID
    ///   The breakpoint index to remove.
    ///
    /// @result
    ///   \b true if the breakpoint \a breakID was in the list.
    //------------------------------------------------------------------
    bool
    Remove (lldb::break_id_t breakID, bool notify);

    void
    SetEnabledAll (bool enabled);

    //------------------------------------------------------------------
    /// Removes all the breakpoints from this list.
    //------------------------------------------------------------------
    void
    RemoveAll (bool notify);

    //------------------------------------------------------------------
    /// Tell all the breakpoints to update themselves due to a change in the
    /// modules in \a module_list.  \a added says whether the module was loaded
    /// or unloaded.
    ///
    /// @param[in] module_list
    ///   The module list that has changed.
    ///
    /// @param[in] added
    ///   \b true if the modules are loaded, \b false if unloaded.
    //------------------------------------------------------------------
    void
    UpdateBreakpoints (ModuleList &module_list, bool added);
    
    void
    UpdateBreakpointsWhenModuleIsReplaced (lldb::ModuleSP old_module_sp, lldb::ModuleSP new_module_sp);

    void
    ClearAllBreakpointSites ();
    
    //------------------------------------------------------------------
    /// Sets the passed in Locker to hold the Breakpoint List mutex.
    ///
    /// @param[in] locker
    ///   The locker object that is set.
    //------------------------------------------------------------------
    void
    GetListMutex (lldb_private::Mutex::Locker &locker);

protected:
    typedef std::list<lldb::BreakpointSP> bp_collection;

    bp_collection::iterator
    GetBreakpointIDIterator(lldb::break_id_t breakID);

    bp_collection::const_iterator
    GetBreakpointIDConstIterator(lldb::break_id_t breakID) const;

    mutable Mutex m_mutex;
    bp_collection m_breakpoints;  // The breakpoint list, currently a list.
    lldb::break_id_t m_next_break_id;
    bool m_is_internal;

private:
    DISALLOW_COPY_AND_ASSIGN (BreakpointList);
};

} // namespace lldb_private

#endif  // liblldb_BreakpointList_h_