summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/API/SBBroadcaster.cpp2
-rw-r--r--lldb/source/API/SBCommandInterpreter.cpp6
-rw-r--r--lldb/source/API/SBCommunication.cpp5
-rw-r--r--lldb/source/API/SBEvent.cpp10
-rw-r--r--lldb/source/API/SBListener.cpp36
-rw-r--r--lldb/source/API/SBProcess.cpp14
-rw-r--r--lldb/source/API/SBTarget.cpp7
-rw-r--r--lldb/source/Commands/CommandObjectProcess.cpp2
-rw-r--r--lldb/source/Core/Broadcaster.cpp184
-rw-r--r--lldb/source/Core/Communication.cpp11
-rw-r--r--lldb/source/Core/Debugger.cpp3
-rw-r--r--lldb/source/Core/Listener.cpp41
-rw-r--r--lldb/source/Interpreter/CommandInterpreter.cpp11
-rw-r--r--lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp2
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp2
-rw-r--r--lldb/source/Target/Process.cpp14
-rw-r--r--lldb/source/Target/Target.cpp66
-rw-r--r--lldb/source/Target/TargetList.cpp14
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;
OpenPOWER on IntegriCloud