124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- BreakpointList.cpp --------------------------------------*- 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#include "lldb/Breakpoint/BreakpointList.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
16c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton#include "lldb/Target/Target.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::BreakpointList (bool is_internal) :
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_breakpoints(),
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_next_break_id (0),
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_is_internal (is_internal)
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::~BreakpointList()
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbreak_id_t
35c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpointList::Add (BreakpointSP &bp_sp, bool notify)
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Internal breakpoint IDs are negative, normal ones are positive
39c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    bp_sp->SetID (m_is_internal ? --m_next_break_id : ++m_next_break_id);
40c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
41c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    m_breakpoints.push_back(bp_sp);
42c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    if (notify)
43c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    {
44c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        if (bp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
45c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton            bp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
46c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton                                               new Breakpoint::BreakpointEventData (eBreakpointEventTypeAdded, bp_sp));
47c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    }
48c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    return bp_sp->GetID();
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
52c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpointList::Remove (break_id_t break_id, bool notify)
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator pos = GetBreakpointIDIterator(break_id);    // Predicate
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_breakpoints.end())
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        BreakpointSP bp_sp (*pos);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_breakpoints.erase(pos);
60c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        if (notify)
61c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        {
62c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton            if (bp_sp->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
63c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton                bp_sp->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
64c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton                                                   new Breakpoint::BreakpointEventData (eBreakpointEventTypeRemoved, bp_sp));
65c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        }
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::SetEnabledAll (bool enabled)
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator pos, end = m_breakpoints.end();
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_breakpoints.begin(); pos != end; ++pos)
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        (*pos)->SetEnabled (enabled);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
82c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpointList::RemoveAll (bool notify)
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClearAllBreakpointSites ();
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    if (notify)
88c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    {
89c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        bp_collection::iterator pos, end = m_breakpoints.end();
90c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        for (pos = m_breakpoints.begin(); pos != end; ++pos)
919c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        {
92c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton            if ((*pos)->GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
939c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham            {
94c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton                (*pos)->GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged,
959c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                                                    new Breakpoint::BreakpointEventData (eBreakpointEventTypeRemoved,
969c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                                                                                         *pos));
979c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham            }
989c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        }
99c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    }
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_breakpoints.erase (m_breakpoints.begin(), m_breakpoints.end());
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass BreakpointIDMatches
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointIDMatches (break_id_t break_id) :
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_break_id(break_id)
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool operator() (const BreakpointSP &bp) const
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_break_id == bp->GetID();
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   const break_id_t m_break_id;
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::bp_collection::iterator
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::GetBreakpointIDIterator (break_id_t break_id)
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        BreakpointIDMatches(break_id));             // Predicate
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::bp_collection::const_iterator
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::GetBreakpointIDConstIterator (break_id_t break_id) const
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), // Search full range
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        BreakpointIDMatches(break_id));             // Predicate
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSP
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::FindBreakpointByID (break_id_t break_id)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSP stop_sp;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator pos = GetBreakpointIDIterator(break_id);
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_breakpoints.end())
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        stop_sp = *pos;
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return stop_sp;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSP
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::FindBreakpointByID (break_id_t break_id) const
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSP stop_sp;
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::const_iterator pos = GetBreakpointIDConstIterator(break_id);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_breakpoints.end())
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        stop_sp = *pos;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return stop_sp;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::Dump (Stream *s) const
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
1627e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf("%p: ", this);
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("BreakpointList with %u Breakpoints:\n", (uint32_t)m_breakpoints.size());
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::const_iterator pos;
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::const_iterator end = m_breakpoints.end();
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_breakpoints.begin(); pos != end; ++pos)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        (*pos)->Dump(s);
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSP
17536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonBreakpointList::GetBreakpointAtIndex (size_t i)
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSP stop_sp;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator end = m_breakpoints.end();
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator pos;
18136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t curr_i = 0;
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (curr_i == i)
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            stop_sp = *pos;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return stop_sp;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSP
19136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonBreakpointList::GetBreakpointAtIndex (size_t i) const
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSP stop_sp;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::const_iterator end = m_breakpoints.end();
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::const_iterator pos;
19736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t curr_i = 0;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_breakpoints.begin(), curr_i = 0; pos != end; ++pos, ++curr_i)
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (curr_i == i)
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            stop_sp = *pos;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return stop_sp;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::UpdateBreakpoints (ModuleList& module_list, bool added)
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator end = m_breakpoints.end();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator pos;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_breakpoints.begin(); pos != end; ++pos)
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        (*pos)->ModulesChanged (module_list, added);
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
21803e5e512252fc7971430027d8ea05f64576bcbb3Jim InghamBreakpointList::UpdateBreakpointsWhenModuleIsReplaced (ModuleSP old_module_sp, ModuleSP new_module_sp)
21903e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham{
22003e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    Mutex::Locker locker(m_mutex);
22103e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    bp_collection::iterator end = m_breakpoints.end();
22203e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    bp_collection::iterator pos;
22303e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    for (pos = m_breakpoints.begin(); pos != end; ++pos)
22403e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham        (*pos)->ModuleReplaced (old_module_sp, new_module_sp);
22503e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
22603e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham}
22703e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
22803e5e512252fc7971430027d8ea05f64576bcbb3Jim Inghamvoid
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointList::ClearAllBreakpointSites ()
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator end = m_breakpoints.end();
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bp_collection::iterator pos;
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_breakpoints.begin(); pos != end; ++pos)
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        (*pos)->ClearAllBreakpointSites ();
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2383c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham
2393c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Inghamvoid
2403c7b5b9f83cae58ca366db2bba37dc09485f7dccJim InghamBreakpointList::GetListMutex (Mutex::Locker &locker)
2413c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham{
2421b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham    return locker.Lock (m_mutex);
2433c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham}
244