* Changes due to new team debug info locking strategy.

* In team_delete_team() we no longer explicitly destroy the team debug
  info. It is not necessary, since the terminating debug nub thread will
  do that anyway. Moreover we access the debugger port in a safer manner
  now.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11504 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2005-02-28 00:37:16 +00:00
parent a7ad39fe09
commit 9707863cc9

View File

@ -689,7 +689,7 @@ create_team_struct(const char *name, bool kernel)
list_init(&team->image_list); list_init(&team->image_list);
clear_team_debug_info(&team->debug_info); clear_team_debug_info(&team->debug_info, true);
if (arch_team_init_team_struct(team, kernel) < 0) if (arch_team_init_team_struct(team, kernel) < 0)
goto error2; goto error2;
@ -747,12 +747,8 @@ team_remove_team(struct team *team, struct process_group **_freeGroup)
void void
team_delete_team(struct team *team) team_delete_team(struct team *team)
{ {
// if the team was being debugged, stop that now
team_id teamID = team->id; team_id teamID = team->id;
port_id debuggerPort port_id debuggerPort = -1;
= (team->debug_info.flags & B_TEAM_DEBUG_DEBUGGER_INSTALLED
? team->debug_info.debugger_port : -1);
destroy_team_debug_info(&team->debug_info);
if (team->num_threads > 0) { if (team->num_threads > 0) {
// there are other threads still in this team, // there are other threads still in this team,
@ -769,6 +765,19 @@ team_delete_team(struct team *team)
state = disable_interrupts(); state = disable_interrupts();
GRAB_TEAM_LOCK(); GRAB_TEAM_LOCK();
// If the team was being debugged, that will stop with the termination
// of the nub thread. The team structure has already been removed from
// the team hash table at this point, so noone can install a debugger
// anymore. We fetch the debugger's port to send it a message at the
// bitter end.
GRAB_TEAM_DEBUG_INFO_LOCK(team->debug_info);
if (team->debug_info.flags & B_TEAM_DEBUG_DEBUGGER_INSTALLED)
debuggerPort = team->debug_info.debugger_port;
RELEASE_TEAM_DEBUG_INFO_LOCK(team->debug_info);
// we can safely walk the list because of the lock. no new threads can be created // we can safely walk the list because of the lock. no new threads can be created
// because of the TEAM_STATE_DEATH flag on the team // because of the TEAM_STATE_DEATH flag on the team
temp_thread = team->thread_list; temp_thread = team->thread_list;