diff --git a/src/apps/debugger/target_host_interface/TargetHostInterface.cpp b/src/apps/debugger/target_host_interface/TargetHostInterface.cpp index ac5ba67a5f..890bb1ea86 100644 --- a/src/apps/debugger/target_host_interface/TargetHostInterface.cpp +++ b/src/apps/debugger/target_host_interface/TargetHostInterface.cpp @@ -36,6 +36,7 @@ TeamDebuggerOptions::TeamDebuggerOptions() TargetHostInterface::TargetHostInterface() : BLooper(), + fListeners(), fTeamDebuggers(20, false) { } @@ -43,6 +44,10 @@ TargetHostInterface::TargetHostInterface() TargetHostInterface::~TargetHostInterface() { + for (ListenerList::Iterator it = fListeners.GetIterator(); + Listener* listener = it.Next();) { + listener->TargetHostInterfaceQuit(this); + } } @@ -124,6 +129,22 @@ TargetHostInterface::RemoveTeamDebugger(TeamDebugger* debugger) } +void +TargetHostInterface::AddListener(Listener* listener) +{ + AutoLocker interfaceLocker(this); + fListeners.Add(listener); +} + + +void +TargetHostInterface::RemoveListener(Listener* listener) +{ + AutoLocker interfaceLocker(this); + fListeners.Remove(listener); +} + + void TargetHostInterface::Quit() { @@ -172,6 +193,7 @@ TargetHostInterface::TeamDebuggerStarted(TeamDebugger* debugger) { AutoLocker locker(this); AddTeamDebugger(debugger); + _NotifyTeamDebuggerStarted(debugger); } @@ -189,9 +211,9 @@ TargetHostInterface::TeamDebuggerQuit(TeamDebugger* debugger) { AutoLocker interfaceLocker(this); RemoveTeamDebugger(debugger); - interfaceLocker.Unlock(); if (debugger->Thread() >= 0) { + _NotifyTeamDebuggerQuit(debugger); BMessage message(MSG_TEAM_DEBUGGER_QUIT); message.AddInt32("thread", debugger->Thread()); PostMessage(&message); @@ -251,6 +273,26 @@ TargetHostInterface::_StartTeamDebugger(team_id teamID, } +void +TargetHostInterface::_NotifyTeamDebuggerStarted(TeamDebugger* debugger) +{ + for (ListenerList::Iterator it = fListeners.GetIterator(); + Listener* listener = it.Next();) { + listener->TeamDebuggerStarted(debugger); + } +} + + +void +TargetHostInterface::_NotifyTeamDebuggerQuit(TeamDebugger* debugger) +{ + for (ListenerList::Iterator it = fListeners.GetIterator(); + Listener* listener = it.Next();) { + listener->TeamDebuggerQuit(debugger); + } +} + + /*static*/ int TargetHostInterface::_CompareDebuggers(const TeamDebugger* a, const TeamDebugger* b) @@ -269,3 +311,30 @@ TargetHostInterface::_FindDebuggerByKey(const team_id* team, return 1; return 0; } + + +// #pragma mark - TargetHostInterface::Listener + + +TargetHostInterface::Listener::~Listener() +{ +} + + +void +TargetHostInterface::Listener::TeamDebuggerStarted(TeamDebugger* debugger) +{ +} + + +void +TargetHostInterface::Listener::TeamDebuggerQuit(TeamDebugger* debugger) +{ +} + + +void +TargetHostInterface::Listener::TargetHostInterfaceQuit( + TargetHostInterface* interface) +{ +} diff --git a/src/apps/debugger/target_host_interface/TargetHostInterface.h b/src/apps/debugger/target_host_interface/TargetHostInterface.h index 84b3576c9b..dcac3eafb5 100644 --- a/src/apps/debugger/target_host_interface/TargetHostInterface.h +++ b/src/apps/debugger/target_host_interface/TargetHostInterface.h @@ -10,6 +10,8 @@ #include +#include + #include "TeamDebugger.h" @@ -17,13 +19,13 @@ class DebuggerInterface; class Settings; class SettingsManager; class TargetHost; -class TeamDebugger; struct TeamDebuggerOptions; class UserInterface; class TargetHostInterface : public BLooper, private TeamDebugger::Listener { public: + class Listener; TargetHostInterface(); virtual ~TargetHostInterface(); @@ -52,6 +54,10 @@ public: virtual status_t FindTeamByThread(thread_id thread, team_id& _teamID) const = 0; + + void AddListener(Listener* listener); + void RemoveListener(Listener* listener); + // BLooper virtual void Quit(); virtual void MessageReceived(BMessage* message); @@ -67,18 +73,37 @@ private: status_t _StartTeamDebugger(team_id teamID, const TeamDebuggerOptions& options, bool stopInMain); + + void _NotifyTeamDebuggerStarted( + TeamDebugger* debugger); + void _NotifyTeamDebuggerQuit( + TeamDebugger* debugger); + static int _CompareDebuggers(const TeamDebugger* a, const TeamDebugger* b); static int _FindDebuggerByKey(const team_id* team, const TeamDebugger* debugger); private: + typedef DoublyLinkedList ListenerList; typedef BObjectList TeamDebuggerList; private: + ListenerList fListeners; TeamDebuggerList fTeamDebuggers; }; +class TargetHostInterface::Listener + : public DoublyLinkedListLinkImpl { +public: + virtual ~Listener(); + virtual void TeamDebuggerStarted(TeamDebugger* debugger); + virtual void TeamDebuggerQuit(TeamDebugger* debugger); + virtual void TargetHostInterfaceQuit( + TargetHostInterface* interface); +}; + + struct TeamDebuggerOptions { TeamDebuggerOptions(); int commandLineArgc;