diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/API/SBBroadcaster.cpp | 2 | ||||
-rw-r--r-- | lldb/source/API/SBCommandInterpreter.cpp | 6 | ||||
-rw-r--r-- | lldb/source/API/SBCommunication.cpp | 5 | ||||
-rw-r--r-- | lldb/source/API/SBEvent.cpp | 10 | ||||
-rw-r--r-- | lldb/source/API/SBListener.cpp | 36 | ||||
-rw-r--r-- | lldb/source/API/SBProcess.cpp | 14 | ||||
-rw-r--r-- | lldb/source/API/SBTarget.cpp | 7 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectProcess.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/Broadcaster.cpp | 184 | ||||
-rw-r--r-- | lldb/source/Core/Communication.cpp | 11 | ||||
-rw-r--r-- | lldb/source/Core/Debugger.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Core/Listener.cpp | 41 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandInterpreter.cpp | 11 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Target/Process.cpp | 14 | ||||
-rw-r--r-- | lldb/source/Target/Target.cpp | 66 | ||||
-rw-r--r-- | lldb/source/Target/TargetList.cpp | 14 |
18 files changed, 410 insertions, 20 deletions
diff --git a/lldb/source/API/SBBroadcaster.cpp b/lldb/source/API/SBBroadcaster.cpp index a33f784e30a..9ede891868b 100644 --- a/lldb/source/API/SBBroadcaster.cpp +++ b/lldb/source/API/SBBroadcaster.cpp @@ -25,7 +25,7 @@ SBBroadcaster::SBBroadcaster () : } SBBroadcaster::SBBroadcaster (const char *name) : - m_opaque_sp (new Broadcaster (name)), + m_opaque_sp (new Broadcaster (NULL, name)), m_opaque_ptr (NULL) { m_opaque_ptr = m_opaque_sp.get(); diff --git a/lldb/source/API/SBCommandInterpreter.cpp b/lldb/source/API/SBCommandInterpreter.cpp index e6054789090..cbf2f914089 100644 --- a/lldb/source/API/SBCommandInterpreter.cpp +++ b/lldb/source/API/SBCommandInterpreter.cpp @@ -292,6 +292,12 @@ SBCommandInterpreter::GetBroadcaster () return broadcaster; } +const char * +SBCommandInterpreter::GetBroadcasterClass () +{ + return Communication::GetStaticBroadcasterClass().AsCString(); +} + const char * SBCommandInterpreter::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type) { diff --git a/lldb/source/API/SBCommunication.cpp b/lldb/source/API/SBCommunication.cpp index 6b5ddb37cd6..bf3a49e719e 100644 --- a/lldb/source/API/SBCommunication.cpp +++ b/lldb/source/API/SBCommunication.cpp @@ -255,6 +255,11 @@ SBCommunication::GetBroadcaster () return broadcaster; } +const char * +SBCommunication::GetBroadcasterClass () +{ + return Communication::GetStaticBroadcasterClass().AsCString(); +} // //void diff --git a/lldb/source/API/SBEvent.cpp b/lldb/source/API/SBEvent.cpp index f9d0e0cc3a8..5ba71b0aa30 100644 --- a/lldb/source/API/SBEvent.cpp +++ b/lldb/source/API/SBEvent.cpp @@ -109,6 +109,16 @@ SBEvent::GetBroadcaster () const return broadcaster; } +const char * +SBEvent::GetBroadcasterClass () const +{ + const Event *lldb_event = get(); + if (lldb_event) + return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString(); + else + return "unknown class"; +} + bool SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster) { diff --git a/lldb/source/API/SBListener.cpp b/lldb/source/API/SBListener.cpp index f9816347d11..b1942be36fe 100644 --- a/lldb/source/API/SBListener.cpp +++ b/lldb/source/API/SBListener.cpp @@ -9,9 +9,11 @@ #include "lldb/API/SBListener.h" #include "lldb/API/SBBroadcaster.h" +#include "lldb/API/SBDebugger.h" #include "lldb/API/SBEvent.h" #include "lldb/API/SBStream.h" #include "lldb/Core/Broadcaster.h" +#include "lldb/Core/Debugger.h" #include "lldb/Core/Listener.h" #include "lldb/Core/Log.h" #include "lldb/Core/StreamString.h" @@ -90,6 +92,40 @@ SBListener::Clear () m_opaque_ptr->Clear (); } + uint32_t + SBListener::StartListeningForEventClass (SBDebugger &debugger, + const char *broadcaster_class, + uint32_t event_mask) + { + if (m_opaque_ptr) + { + Debugger *lldb_debugger = debugger.get(); + if (!lldb_debugger) + return 0; + BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask); + return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec); + } + else + return 0; + } + + bool + SBListener::StopListeningForEventClass (SBDebugger &debugger, + const char *broadcaster_class, + uint32_t event_mask) + { + if (m_opaque_ptr) + { + Debugger *lldb_debugger = debugger.get(); + if (!lldb_debugger) + return false; + BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask); + return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec); + } + else + return false; + } + uint32_t SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask) { diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp index 5fc71966078..9e32f91c107 100644 --- a/lldb/source/API/SBProcess.cpp +++ b/lldb/source/API/SBProcess.cpp @@ -74,6 +74,12 @@ SBProcess::~SBProcess() { } +const char * +SBProcess::GetBroadcasterClassName () +{ + return Process::GetStaticBroadcasterClass().AsCString(); +} + lldb::ProcessSP SBProcess::GetSP() const { @@ -743,7 +749,7 @@ SBProcess::GetProcessFromEvent (const SBEvent &event) bool SBProcess::EventIsProcessEvent (const SBEvent &event) { - return Process::ProcessEventData::GetEventDataFromEvent(event.get()) != NULL; + return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; } SBBroadcaster @@ -762,6 +768,12 @@ SBProcess::GetBroadcaster () const return broadcaster; } +const char * +SBProcess::GetBroadcasterClass () +{ + return Process::GetStaticBroadcasterClass().AsCString(); +} + size_t SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) { diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp index 687c44e01f2..7fdfb347429 100644 --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -87,6 +87,12 @@ SBTarget::~SBTarget() { } +const char * +SBTarget::GetBroadcasterClassName () +{ + return Target::GetStaticBroadcasterClass().AsCString(); +} + bool SBTarget::IsValid () const { @@ -1235,7 +1241,6 @@ SBTarget::GetBroadcaster () const return broadcaster; } - bool SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) { diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index d9070a31ce5..ca839864046 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -30,7 +30,7 @@ using namespace lldb_private; //------------------------------------------------------------------------- // CommandObjectProcessLaunch //------------------------------------------------------------------------- -#pragma mark CommandObjectProjectLaunch +#pragma mark CommandObjectProcessLaunch class CommandObjectProcessLaunch : public CommandObject { public: diff --git a/lldb/source/Core/Broadcaster.cpp b/lldb/source/Core/Broadcaster.cpp index 1d264a6c675..4a4396f470b 100644 --- a/lldb/source/Core/Broadcaster.cpp +++ b/lldb/source/Core/Broadcaster.cpp @@ -21,12 +21,13 @@ using namespace lldb; using namespace lldb_private; -Broadcaster::Broadcaster (const char *name) : +Broadcaster::Broadcaster (BroadcasterManager *manager, const char *name) : m_broadcaster_name (name), m_listeners (), m_listeners_mutex (Mutex::eMutexTypeRecursive), m_hijacking_listeners(), - m_hijacking_masks() + m_hijacking_masks(), + m_manager (manager) { LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); if (log) @@ -44,6 +45,15 @@ Broadcaster::~Broadcaster() } void +Broadcaster::CheckInWithManager () +{ + if (m_manager != NULL) + { + m_manager->SignUpListenersForBroadcaster(*this); + } +} + +void Broadcaster::Clear() { Mutex::Locker listeners_locker(m_listeners_mutex); @@ -297,3 +307,173 @@ Broadcaster::RestoreBroadcaster () m_hijacking_masks.pop_back(); } +ConstString & +Broadcaster::GetBroadcasterClass() const +{ + static ConstString class_name ("lldb.anonymous"); + return class_name; +} + +BroadcastEventSpec::BroadcastEventSpec (const BroadcastEventSpec &rhs) : + m_broadcaster_class (rhs.m_broadcaster_class), + m_event_bits (rhs.m_event_bits) +{ +} + +bool +BroadcastEventSpec::operator< (const BroadcastEventSpec &rhs) const +{ + if (GetBroadcasterClass() == rhs.GetBroadcasterClass()) + { + return GetEventBits() < rhs.GetEventBits(); + } + else + { + return GetBroadcasterClass() < rhs.GetBroadcasterClass(); + } +} + +const BroadcastEventSpec & +BroadcastEventSpec::operator= (const BroadcastEventSpec &rhs) +{ + m_broadcaster_class = rhs.m_broadcaster_class; + m_event_bits = rhs.m_event_bits; + return *this; +} + +BroadcasterManager::BroadcasterManager() : + m_manager_mutex(Mutex::eMutexTypeRecursive) +{ + +} + +uint32_t +BroadcasterManager::RegisterListenerForEvents (Listener &listener, BroadcastEventSpec event_spec) +{ + Mutex::Locker locker(m_manager_mutex); + + collection::iterator iter = m_event_map.begin(), end_iter = m_event_map.end(); + uint32_t available_bits = event_spec.GetEventBits(); + + while (iter != end_iter + && (iter = find_if (iter, end_iter, BroadcasterClassMatches(event_spec.GetBroadcasterClass()))) != end_iter) + { + available_bits &= ~((*iter).first.GetEventBits()); + iter++; + } + + if (available_bits != 0) + { + m_event_map.insert (event_listener_key (BroadcastEventSpec (event_spec.GetBroadcasterClass(), available_bits), &listener)); + m_listeners.insert(&listener); + } + + return available_bits; +} + +bool +BroadcasterManager::UnregisterListenerForEvents (Listener &listener, BroadcastEventSpec event_spec) +{ + Mutex::Locker locker(m_manager_mutex); + bool removed_some = false; + + if (m_listeners.erase(&listener) == 0) + return false; + + ListenerMatchesAndSharedBits predicate (event_spec, listener); + std::vector<BroadcastEventSpec> to_be_readded; + uint32_t event_bits_to_remove = event_spec.GetEventBits(); + + // Go through the map and delete the exact matches, and build a list of matches that weren't exact to re-add: + while (1) + { + collection::iterator iter, end_iter = m_event_map.end(); + iter = find_if (m_event_map.begin(), end_iter, predicate); + if (iter == end_iter) + { + break; + } + else + { + uint32_t iter_event_bits = (*iter).first.GetEventBits(); + removed_some = true; + + if (event_bits_to_remove != iter_event_bits) + { + uint32_t new_event_bits = iter_event_bits & ~event_bits_to_remove; + to_be_readded.push_back(BroadcastEventSpec (event_spec.GetBroadcasterClass(), new_event_bits)); + } + m_event_map.erase (iter); + } + } + + // Okay now add back the bits that weren't completely removed: + for (size_t i = 0; i < to_be_readded.size(); i++) + { + m_event_map.insert (event_listener_key (to_be_readded[i], &listener)); + } + + return removed_some; +} + +Listener * +BroadcasterManager::GetListenerForEventSpec (BroadcastEventSpec event_spec) const +{ + Mutex::Locker locker(*(const_cast<Mutex *> (&m_manager_mutex))); + + collection::const_iterator iter, end_iter = m_event_map.end(); + iter = find_if (m_event_map.begin(), end_iter, BroadcastEventSpecMatches (event_spec)); + if (iter != end_iter) + return (*iter).second; + else + return NULL; +} + +void +BroadcasterManager::RemoveListener (Listener &listener) +{ + Mutex::Locker locker(m_manager_mutex); + ListenerMatches predicate (listener); + + + if (m_listeners.erase (&listener) == 0) + return; + + while (1) + { + collection::iterator iter, end_iter = m_event_map.end(); + iter = find_if (m_event_map.begin(), end_iter, predicate); + if (iter == end_iter) + break; + else + m_event_map.erase(iter); + } +} + +void +BroadcasterManager::SignUpListenersForBroadcaster (Broadcaster &broadcaster) +{ + Mutex::Locker locker(m_manager_mutex); + + collection::iterator iter = m_event_map.begin(), end_iter = m_event_map.end(); + + while (iter != end_iter + && (iter = find_if (iter, end_iter, BroadcasterClassMatches(broadcaster.GetBroadcasterClass()))) != end_iter) + { + (*iter).second->StartListeningForEvents (&broadcaster, (*iter).first.GetEventBits()); + iter++; + } +} + +void +BroadcasterManager::Clear () +{ + Mutex::Locker locker(m_manager_mutex); + listener_collection::iterator end_iter = m_listeners.end(); + + for (listener_collection::iterator iter = m_listeners.begin(); iter != end_iter; iter++) + (*iter)->BroadcasterManagerWillDestruct(this); + m_listeners.clear(); + m_event_map.clear(); + +} diff --git a/lldb/source/Core/Communication.cpp b/lldb/source/Core/Communication.cpp index 45850f3858b..35af6440df2 100644 --- a/lldb/source/Core/Communication.cpp +++ b/lldb/source/Core/Communication.cpp @@ -23,11 +23,18 @@ using namespace lldb; using namespace lldb_private; +ConstString & +Communication::GetStaticBroadcasterClass () +{ + static ConstString class_name ("lldb.communication"); + return class_name; +} + //---------------------------------------------------------------------- // Constructor //---------------------------------------------------------------------- Communication::Communication(const char *name) : - Broadcaster (name), + Broadcaster (NULL, name), m_connection_sp (), m_read_thread (LLDB_INVALID_HOST_THREAD), m_read_thread_enabled (false), @@ -48,6 +55,8 @@ Communication::Communication(const char *name) : SetEventName (eBroadcastBitReadThreadDidExit, "read thread did exit"); SetEventName (eBroadcastBitReadThreadShouldExit, "read thread should exit"); SetEventName (eBroadcastBitPacketAvailable, "packet available"); + + CheckInWithManager(); } //---------------------------------------------------------------------- diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index ad6b86f044b..7f768e9ec41 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -333,7 +333,7 @@ Debugger::Debugger () : m_input_file (), m_output_file (), m_error_file (), - m_target_list (), + m_target_list (*this), m_platform_list (), m_listener ("lldb.Debugger"), m_source_manager(*this), @@ -374,6 +374,7 @@ Debugger::Clear() target_sp->Destroy(); } } + BroadcasterManager::Clear (); DisconnectInput(); } diff --git a/lldb/source/Core/Listener.cpp b/lldb/source/Core/Listener.cpp index 7b0888aac92..060d5e6b47b 100644 --- a/lldb/source/Core/Listener.cpp +++ b/lldb/source/Core/Listener.cpp @@ -40,6 +40,13 @@ Listener::Listener(const char *name) : Listener::~Listener() { LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); + Mutex::Locker locker (m_broadcasters_mutex); + + size_t num_managers = m_broadcaster_managers.size(); + + for (int i = 0; i < num_managers; i++) + m_broadcaster_managers[i]->RemoveListener(*this); + if (log) log->Printf ("%p Listener::~Listener('%s')", this, m_name.c_str()); Clear(); @@ -164,6 +171,16 @@ Listener::BroadcasterWillDestruct (Broadcaster *broadcaster) } void +Listener::BroadcasterManagerWillDestruct (BroadcasterManager *manager) +{ + // Just need to remove this broadcast manager from the list of managers: + broadcaster_manager_collection::iterator iter, end_iter = m_broadcaster_managers.end(); + iter = find(m_broadcaster_managers.begin(), end_iter, manager); + if (iter != end_iter) + m_broadcaster_managers.erase (iter); +} + +void Listener::AddEvent (EventSP &event_sp) { LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EVENTS)); @@ -483,3 +500,27 @@ Listener::HandleBroadcastEvent (EventSP &event_sp) } return num_handled; } + +uint32_t +Listener::StartListeningForEventSpec (BroadcasterManager &manager, + const BroadcastEventSpec &event_spec) +{ + Mutex::Locker locker(m_broadcasters_mutex); + + uint32_t bits_acquired = manager.RegisterListenerForEvents(*this, event_spec); + if (bits_acquired) + m_broadcaster_managers.push_back(&manager); + + return bits_acquired; +} + +bool +Listener::StopListeningForEventSpec (BroadcasterManager &manager, + const BroadcastEventSpec &event_spec) +{ + Mutex::Locker locker(m_broadcasters_mutex); + return manager.UnregisterListenerForEvents (*this, event_spec); + +} + + diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index 9d6ac257ee8..8b4dc81561b 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -59,13 +59,20 @@ using namespace lldb; using namespace lldb_private; +ConstString & +CommandInterpreter::GetStaticBroadcasterClass () +{ + static ConstString class_name ("lldb.commandInterpreter"); + return class_name; +} + CommandInterpreter::CommandInterpreter ( Debugger &debugger, ScriptLanguage script_language, bool synchronous_execution ) : - Broadcaster ("lldb.command-interpreter"), + Broadcaster (&debugger, "lldb.command-interpreter"), m_debugger (debugger), m_synchronous_execution (synchronous_execution), m_skip_lldbinit_files (false), @@ -86,6 +93,8 @@ CommandInterpreter::CommandInterpreter SetEventName (eBroadcastBitThreadShouldExit, "thread-should-exit"); SetEventName (eBroadcastBitResetPrompt, "reset-prompt"); SetEventName (eBroadcastBitQuitCommandReceived, "quit"); + + CheckInWithManager (); } void diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp index 119ffcc717d..ab872f8e7d7 100644 --- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp +++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp @@ -89,7 +89,7 @@ ProcessKDP::CanDebug(Target &target, bool plugin_specified_by_name) ProcessKDP::ProcessKDP(Target& target, Listener &listener) : Process (target, listener), m_comm("lldb.process.kdp-remote.communication"), - m_async_broadcaster ("lldb.process.kdp-remote.async-broadcaster"), + m_async_broadcaster (NULL, "lldb.process.kdp-remote.async-broadcaster"), m_async_thread (LLDB_INVALID_HOST_THREAD) { // m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit, "async thread should exit"); diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index afafaafaa06..8424d2a32be 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -146,7 +146,7 @@ ProcessGDBRemote::ProcessGDBRemote(Target& target, Listener &listener) : m_last_stop_packet (), m_last_stop_packet_mutex (Mutex::eMutexTypeNormal), m_register_info (), - m_async_broadcaster ("lldb.process.gdb-remote.async-broadcaster"), + m_async_broadcaster (NULL, "lldb.process.gdb-remote.async-broadcaster"), m_async_thread (LLDB_INVALID_HOST_THREAD), m_continue_c_tids (), m_continue_C_tids (), diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 8083c9543bf..6f5589bb189 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -743,19 +743,25 @@ Process::FindPlugin (Target &target, const char *plugin_name, Listener &listener return process_sp; } +ConstString & +Process::GetStaticBroadcasterClass () +{ + static ConstString class_name ("lldb.process"); + return class_name; +} //---------------------------------------------------------------------- // Process constructor //---------------------------------------------------------------------- Process::Process(Target &target, Listener &listener) : UserID (LLDB_INVALID_PROCESS_ID), - Broadcaster ("lldb.process"), + Broadcaster (&(target.GetDebugger()), "lldb.process"), ProcessInstanceSettings (GetSettingsController()), m_target (target), m_public_state (eStateUnloaded), m_private_state (eStateUnloaded), - m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"), - m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"), + m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"), + m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"), m_private_state_listener ("lldb.process.internal_state_listener"), m_private_state_control_wait(), m_private_state_thread (LLDB_INVALID_HOST_THREAD), @@ -783,6 +789,8 @@ Process::Process(Target &target, Listener &listener) : m_can_jit(eCanJITDontKnow) { UpdateInstanceName(); + + CheckInWithManager (); LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); if (log) diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 6a6cb0eae7e..ef1eed3482b 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -41,11 +41,18 @@ using namespace lldb; using namespace lldb_private; +ConstString & +Target::GetStaticBroadcasterClass () +{ + static ConstString class_name ("lldb.target"); + return class_name; +} + //---------------------------------------------------------------------- // Target constructor //---------------------------------------------------------------------- Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) : - Broadcaster ("lldb.target"), + Broadcaster (&debugger, "lldb.target"), ExecutionContextScope (), TargetInstanceSettings (GetSettingsController()), m_debugger (debugger), @@ -72,6 +79,8 @@ Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::Plat SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed"); SetEventName (eBroadcastBitModulesLoaded, "modules-loaded"); SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded"); + + CheckInWithManager(); LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); if (log) @@ -2773,3 +2782,58 @@ Target::SettingsController::instance_settings_table[] = { TSC_DISABLE_STDIO , eSetVarTypeBoolean, "false" , NULL, false, false, "Disable stdin/stdout for process (e.g. for a GUI application)" }, { NULL , eSetVarTypeNone , NULL , NULL, false, false, NULL } }; + +const ConstString & +Target::TargetEventData::GetFlavorString () +{ + static ConstString g_flavor ("Target::TargetEventData"); + return g_flavor; +} + +const ConstString & +Target::TargetEventData::GetFlavor () const +{ + return TargetEventData::GetFlavorString (); +} + +Target::TargetEventData::TargetEventData (const lldb::TargetSP &new_target_sp) : + EventData(), + m_target_sp (new_target_sp) +{ +} + +Target::TargetEventData::~TargetEventData() +{ + +} + +void +Target::TargetEventData::Dump (Stream *s) const +{ + +} + +const TargetSP +Target::TargetEventData::GetTargetFromEvent (const lldb::EventSP &event_sp) +{ + TargetSP target_sp; + + const TargetEventData *data = GetEventDataFromEvent (event_sp.get()); + if (data) + target_sp = data->m_target_sp; + + return target_sp; +} + +const Target::TargetEventData * +Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr) +{ + if (event_ptr) + { + const EventData *event_data = event_ptr->GetData(); + if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString()) + return static_cast <const TargetEventData *> (event_ptr->GetData()); + } + return NULL; +} + diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index e412beb1da5..38240e12318 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -25,16 +25,23 @@ using namespace lldb; using namespace lldb_private; +ConstString & +TargetList::GetStaticBroadcasterClass () +{ + static ConstString class_name ("lldb.targetList"); + return class_name; +} //---------------------------------------------------------------------- // TargetList constructor //---------------------------------------------------------------------- -TargetList::TargetList() : - Broadcaster("TargetList"), +TargetList::TargetList(Debugger &debugger) : + Broadcaster(&debugger, "TargetList"), m_target_list(), m_target_list_mutex (Mutex::eMutexTypeRecursive), m_selected_target_idx (0) { + CheckInWithManager(); } //---------------------------------------------------------------------- @@ -176,9 +183,6 @@ TargetList::CreateTarget Mutex::Locker locker(m_target_list_mutex); m_selected_target_idx = m_target_list.size(); m_target_list.push_back(target_sp); - - // Now sign the Debugger up to listen to target events for this target: - debugger.GetListener().StartListeningForEvents(target_sp.get(), Target::eBroadcastBitBreakpointChanged); } return error; |