Debugger: Fix handling of team_id clashes.
TeamDebugger: - Add accessor to query whether the debugger's interface is a post mortem core rather than a live team. TargetHostInterface: - When asked to locate a team debugger by team_id, as is done for attach requests to determine if we already have an existing instance attached, skip over post mortems. This takes care of the potential problem of detecting a core instance with the same team_id as a live team, and consequently refusing the attach request. - When a team debugger quits, use its actual pointer to look it up rather than its team ID, as we could otherwise potentially remove the wrong one in the case of a clash.
This commit is contained in:
parent
2c4195e840
commit
61f0bf59fb
@ -218,6 +218,7 @@ TeamDebugger::TeamDebugger(Listener* listener, UserInterface* userInterface,
|
||||
fSettingsManager(settingsManager),
|
||||
fTeam(NULL),
|
||||
fTeamID(-1),
|
||||
fIsPostMortem(false),
|
||||
fImageHandlers(NULL),
|
||||
fImageInfoPendingThreads(NULL),
|
||||
fDebuggerInterface(NULL),
|
||||
@ -337,6 +338,7 @@ TeamDebugger::Init(DebuggerInterface* interface, thread_id threadID, int argc,
|
||||
fDebuggerInterface = interface;
|
||||
fDebuggerInterface->AcquireReference();
|
||||
fTeamID = interface->TeamID();
|
||||
fIsPostMortem = interface->IsPostMortem();
|
||||
|
||||
|
||||
// create file manager
|
||||
|
@ -51,6 +51,8 @@ public:
|
||||
|
||||
team_id TeamID() const { return fTeamID; }
|
||||
|
||||
bool IsPostMortem() const { return fIsPostMortem; }
|
||||
|
||||
int ArgumentCount() const
|
||||
{ return fCommandLineArgc; }
|
||||
const char** Arguments() const
|
||||
@ -245,6 +247,7 @@ private:
|
||||
SettingsManager* fSettingsManager;
|
||||
::Team* fTeam;
|
||||
team_id fTeamID;
|
||||
bool fIsPostMortem;
|
||||
ThreadHandlerTable fThreadHandlers;
|
||||
// protected by the team lock
|
||||
ImageHandlerTable* fImageHandlers;
|
||||
|
@ -110,7 +110,13 @@ TargetHostInterface::TeamDebuggerAt(int32 index) const
|
||||
TeamDebugger*
|
||||
TargetHostInterface::FindTeamDebugger(team_id team) const
|
||||
{
|
||||
return fTeamDebuggers.BinarySearchByKey(team, &_FindDebuggerByKey);
|
||||
for (int32 i = 0; i < fTeamDebuggers.CountItems(); i++) {
|
||||
TeamDebugger* debugger = fTeamDebuggers.ItemAt(i);
|
||||
if (debugger->TeamID() == team && !debugger->IsPostMortem())
|
||||
return debugger;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -127,10 +133,12 @@ TargetHostInterface::AddTeamDebugger(TeamDebugger* debugger)
|
||||
void
|
||||
TargetHostInterface::RemoveTeamDebugger(TeamDebugger* debugger)
|
||||
{
|
||||
int32 index = fTeamDebuggers.BinarySearchIndexByKey(debugger->TeamID(),
|
||||
&_FindDebuggerByKey);
|
||||
if (index >= 0)
|
||||
fTeamDebuggers.RemoveItemAt(index);
|
||||
for (int32 i = 0; i < fTeamDebuggers.CountItems(); i++) {
|
||||
if (fTeamDebuggers.ItemAt(i) == debugger) {
|
||||
fTeamDebuggers.RemoveItemAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -317,18 +325,6 @@ TargetHostInterface::_CompareDebuggers(const TeamDebugger* a,
|
||||
}
|
||||
|
||||
|
||||
/*static*/ int
|
||||
TargetHostInterface::_FindDebuggerByKey(const team_id* team,
|
||||
const TeamDebugger* debugger)
|
||||
{
|
||||
if (*team < debugger->TeamID())
|
||||
return -1;
|
||||
else if (*team > debugger->TeamID())
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark - TargetHostInterface::Listener
|
||||
|
||||
|
||||
|
@ -84,8 +84,6 @@ private:
|
||||
|
||||
static int _CompareDebuggers(const TeamDebugger* a,
|
||||
const TeamDebugger* b);
|
||||
static int _FindDebuggerByKey(const team_id* team,
|
||||
const TeamDebugger* debugger);
|
||||
private:
|
||||
typedef DoublyLinkedList<Listener> ListenerList;
|
||||
typedef BObjectList<TeamDebugger> TeamDebuggerList;
|
||||
|
Loading…
Reference in New Issue
Block a user