1//===-- WatchpointList.h ----------------------------------------*- 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#ifndef liblldb_WatchpointList_h_
11#define liblldb_WatchpointList_h_
12
13// C Includes
14// C++ Includes
15#include <list>
16#include <vector>
17// Other libraries and framework includes
18// Project includes
19#include "lldb/lldb-private.h"
20#include "lldb/Core/Address.h"
21#include "lldb/Host/Mutex.h"
22
23namespace lldb_private {
24
25//----------------------------------------------------------------------
26/// @class WatchpointList WatchpointList.h "lldb/Breakpoint/WatchpointList.h"
27/// @brief This class is used by Watchpoint to manage a list of watchpoints,
28//  each watchpoint in the list has a unique ID, and is unique by Address as
29//  well.
30//----------------------------------------------------------------------
31
32class WatchpointList
33{
34// Only Target can make the watchpoint list, or add elements to it.
35// This is not just some random collection of watchpoints.  Rather, the act of
36// adding the watchpoint to this list sets its ID.
37friend class Watchpoint;
38friend class Target;
39
40public:
41    //------------------------------------------------------------------
42    /// Default constructor makes an empty list.
43    //------------------------------------------------------------------
44    WatchpointList();
45
46    //------------------------------------------------------------------
47    /// Destructor, currently does nothing.
48    //------------------------------------------------------------------
49    ~WatchpointList();
50
51    //------------------------------------------------------------------
52    /// Add a Watchpoint to the list.
53    ///
54    /// @param[in] wp_sp
55    ///    A shared pointer to a watchpoint being added to the list.
56    ///
57    /// @return
58    ///    The ID of the Watchpoint in the list.
59    //------------------------------------------------------------------
60    lldb::watch_id_t
61    Add (const lldb::WatchpointSP& wp_sp, bool notify);
62
63    //------------------------------------------------------------------
64    /// Standard "Dump" method.
65    //------------------------------------------------------------------
66    void
67    Dump (Stream *s) const;
68
69    //------------------------------------------------------------------
70    /// Dump with lldb::DescriptionLevel.
71    //------------------------------------------------------------------
72    void
73    DumpWithLevel (Stream *s, lldb::DescriptionLevel description_level) const;
74
75    //------------------------------------------------------------------
76    /// Returns a shared pointer to the watchpoint at address
77    /// \a addr -
78    /// const version.
79    ///
80    /// @param[in] addr
81    ///     The address to look for.
82    ///
83    /// @result
84    ///     A shared pointer to the watchpoint.  May contain a NULL
85    ///     pointer if the watchpoint doesn't exist.
86    //------------------------------------------------------------------
87    const lldb::WatchpointSP
88    FindByAddress (lldb::addr_t addr) const;
89
90    //------------------------------------------------------------------
91    /// Returns a shared pointer to the watchpoint with watchpoint spec
92    /// \a spec -
93    /// const version.
94    ///
95    /// @param[in] spec
96    ///     The watchpoint spec to look for.
97    ///
98    /// @result
99    ///     A shared pointer to the watchpoint.  May contain a NULL
100    ///     pointer if the watchpoint doesn't exist.
101    //------------------------------------------------------------------
102    const lldb::WatchpointSP
103    FindBySpec (std::string spec) const;
104
105    //------------------------------------------------------------------
106    /// Returns a shared pointer to the watchpoint with id
107    /// \a watchID, const
108    /// version.
109    ///
110    /// @param[in] watchID
111    ///     The watchpoint location ID to seek for.
112    ///
113    /// @result
114    ///     A shared pointer to the watchpoint.  May contain a NULL
115    ///     pointer if the watchpoint doesn't exist.
116    //------------------------------------------------------------------
117    lldb::WatchpointSP
118    FindByID (lldb::watch_id_t watchID) const;
119
120    //------------------------------------------------------------------
121    /// Returns the watchpoint id to the watchpoint
122    /// at address \a addr.
123    ///
124    /// @param[in] addr
125    ///     The address to match.
126    ///
127    /// @result
128    ///     The ID of the watchpoint, or LLDB_INVALID_WATCH_ID.
129    //------------------------------------------------------------------
130    lldb::watch_id_t
131    FindIDByAddress (lldb::addr_t addr);
132
133    //------------------------------------------------------------------
134    /// Returns the watchpoint id to the watchpoint
135    /// with watchpoint spec \a spec.
136    ///
137    /// @param[in] spec
138    ///     The watchpoint spec to match.
139    ///
140    /// @result
141    ///     The ID of the watchpoint, or LLDB_INVALID_WATCH_ID.
142    //------------------------------------------------------------------
143    lldb::watch_id_t
144    FindIDBySpec (std::string spec);
145
146    //------------------------------------------------------------------
147    /// Returns a shared pointer to the watchpoint with index \a i.
148    ///
149    /// @param[in] i
150    ///     The watchpoint index to seek for.
151    ///
152    /// @result
153    ///     A shared pointer to the watchpoint.  May contain a NULL pointer if
154    ///     the watchpoint doesn't exist.
155    //------------------------------------------------------------------
156    lldb::WatchpointSP
157    GetByIndex (uint32_t i);
158
159    //------------------------------------------------------------------
160    /// Returns a shared pointer to the watchpoint with index \a i, const
161    /// version.
162    ///
163    /// @param[in] i
164    ///     The watchpoint index to seek for.
165    ///
166    /// @result
167    ///     A shared pointer to the watchpoint.  May contain a NULL pointer if
168    ///     the watchpoint location doesn't exist.
169    //------------------------------------------------------------------
170    const lldb::WatchpointSP
171    GetByIndex (uint32_t i) const;
172
173    //------------------------------------------------------------------
174    /// Removes the watchpoint given by \b watchID from this list.
175    ///
176    /// @param[in] watchID
177    ///   The watchpoint ID to remove.
178    ///
179    /// @result
180    ///   \b true if the watchpoint \a watchID was in the list.
181    //------------------------------------------------------------------
182    bool
183    Remove (lldb::watch_id_t watchID, bool notify);
184
185    //------------------------------------------------------------------
186    /// Returns the number hit count of all watchpoints in this list.
187    ///
188    /// @result
189    ///     Hit count of all watchpoints in this list.
190    //------------------------------------------------------------------
191    uint32_t
192    GetHitCount () const;
193
194    //------------------------------------------------------------------
195    /// Enquires of the watchpoint in this list with ID \a watchID whether we
196    /// should stop.
197    ///
198    /// @param[in] context
199    ///     This contains the information about this stop.
200    ///
201    /// @param[in] watchID
202    ///     This watch ID that we hit.
203    ///
204    /// @return
205    ///     \b true if we should stop, \b false otherwise.
206    //------------------------------------------------------------------
207    bool
208    ShouldStop (StoppointCallbackContext *context,
209                lldb::watch_id_t watchID);
210
211    //------------------------------------------------------------------
212    /// Returns the number of elements in this watchpoint list.
213    ///
214    /// @result
215    ///     The number of elements.
216    //------------------------------------------------------------------
217    size_t
218    GetSize() const
219    {
220        Mutex::Locker locker(m_mutex);
221        return m_watchpoints.size();
222    }
223
224    //------------------------------------------------------------------
225    /// Print a description of the watchpoints in this list to the stream \a s.
226    ///
227    /// @param[in] s
228    ///     The stream to which to print the description.
229    ///
230    /// @param[in] level
231    ///     The description level that indicates the detail level to
232    ///     provide.
233    ///
234    /// @see lldb::DescriptionLevel
235    //------------------------------------------------------------------
236    void
237    GetDescription (Stream *s,
238                    lldb::DescriptionLevel level);
239
240    void
241    SetEnabledAll (bool enabled);
242
243    void
244    RemoveAll (bool notify);
245
246    //------------------------------------------------------------------
247    /// Sets the passed in Locker to hold the Watchpoint List mutex.
248    ///
249    /// @param[in] locker
250    ///   The locker object that is set.
251    //------------------------------------------------------------------
252    void
253    GetListMutex (lldb_private::Mutex::Locker &locker);
254
255protected:
256    typedef std::list<lldb::WatchpointSP> wp_collection;
257    typedef std::vector<lldb::watch_id_t> id_vector;
258
259    id_vector
260    GetWatchpointIDs() const;
261
262    wp_collection::iterator
263    GetIDIterator(lldb::watch_id_t watchID);
264
265    wp_collection::const_iterator
266    GetIDConstIterator(lldb::watch_id_t watchID) const;
267
268    wp_collection m_watchpoints;
269    mutable Mutex m_mutex;
270
271    lldb::watch_id_t m_next_wp_id;
272};
273
274} // namespace lldb_private
275
276#endif  // liblldb_WatchpointList_h_
277