124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- BreakpointList.h ----------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_BreakpointList_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_BreakpointList_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <list>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/Breakpoint.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class BreakpointList BreakpointList.h "lldb/Breakpoint/BreakpointList.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief This class manages a list of breakpoints.
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// General Outline:
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Allows adding and removing breakpoints and find by ID and index.
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass BreakpointList
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointList (bool is_internal);
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~BreakpointList();
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Add the breakpoint \a bp_sp to the list.
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] bp_sp
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   Shared pointer to the breakpoint that will get added to the list.
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   Returns breakpoint id.
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
49bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    lldb::break_id_t
50c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    Add (lldb::BreakpointSP& bp_sp, bool notify);
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Standard "Dump" method.  At present it does nothing.
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream *s) const;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint with id \a breakID.
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint ID to seek for.
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   breakpoint doesn't exist.
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointSP
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindBreakpointByID (lldb::break_id_t breakID);
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint with id \a breakID.  Const version.
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint ID to seek for.
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   breakpoint doesn't exist.
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::BreakpointSP
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindBreakpointByID (lldb::break_id_t breakID) const;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint with index \a i.
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] i
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint index to seek for.
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   breakpoint doesn't exist.
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointSP
9536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetBreakpointAtIndex (size_t i);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint with index \a i, const version
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] i
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint index to seek for.
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   breakpoint doesn't exist.
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::BreakpointSP
10836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetBreakpointAtIndex (size_t i) const;
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns the number of elements in this breakpoint list.
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The number of elements.
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
117bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    GetSize() const
118bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
119bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        Mutex::Locker locker(m_mutex);
120bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton        return m_breakpoints.size();
121bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Removes the breakpoint given by \b breakID from this list.
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint index to remove.
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   \b true if the breakpoint \a breakID was in the list.
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
133c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    Remove (lldb::break_id_t breakID, bool notify);
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetEnabledAll (bool enabled);
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Removes all the breakpoints from this list.
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
142c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    RemoveAll (bool notify);
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Tell all the breakpoints to update themselves due to a change in the
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// modules in \a module_list.  \a added says whether the module was loaded
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// or unloaded.
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] module_list
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The module list that has changed.
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] added
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   \b true if the modules are loaded, \b false if unloaded.
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateBreakpoints (ModuleList &module_list, bool added);
15703e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
15803e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    void
15903e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    UpdateBreakpointsWhenModuleIsReplaced (lldb::ModuleSP old_module_sp, lldb::ModuleSP new_module_sp);
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClearAllBreakpointSites ();
1633c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham
1643c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    //------------------------------------------------------------------
1653c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    /// Sets the passed in Locker to hold the Breakpoint List mutex.
1663c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    ///
1673c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    /// @param[in] locker
1683c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    ///   The locker object that is set.
1693c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    //------------------------------------------------------------------
1703c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    void
1713c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    GetListMutex (lldb_private::Mutex::Locker &locker);
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::list<lldb::BreakpointSP> bp_collection;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetBreakpointIDIterator(lldb::break_id_t breakID);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::const_iterator
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetBreakpointIDConstIterator(lldb::break_id_t breakID) const;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable Mutex m_mutex;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection m_breakpoints;  // The breakpoint list, currently a list.
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::break_id_t m_next_break_id;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool m_is_internal;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (BreakpointList);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_BreakpointList_h_
194