* Automatic white-space cleanup.

* Handle the new B_DEBUGGER_MESSAGE_HANDED_OVER and pick the "causing thread"
  as our first victim. Fixes #2956.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29303 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2009-02-23 23:02:28 +00:00
parent e1975d3353
commit 1e525344d6
+29 -7
View File
@@ -280,7 +280,7 @@ haiku_cleanup_thread_list(team_debug_info *teamDebugInfo)
thread_debug_info *thread = teamDebugInfo->threads; thread_debug_info *thread = teamDebugInfo->threads;
teamDebugInfo->threads = thread->next; teamDebugInfo->threads = thread->next;
xfree(thread); xfree(thread);
} }
// clear gdb's thread DB // clear gdb's thread DB
init_thread_list(); init_thread_list();
@@ -380,7 +380,7 @@ haiku_cleanup_image_list(team_debug_info *teamDebugInfo)
extended_image_info *image = teamDebugInfo->images; extended_image_info *image = teamDebugInfo->images;
teamDebugInfo->images = image->next; teamDebugInfo->images = image->next;
xfree(image); xfree(image);
} }
} }
@@ -577,7 +577,7 @@ haiku_cleanup_team_debug_info()
delete_port(sTeamDebugInfo.debugger_port); delete_port(sTeamDebugInfo.debugger_port);
sTeamDebugInfo.debugger_port = -1; sTeamDebugInfo.debugger_port = -1;
sTeamDebugInfo.team = -1; sTeamDebugInfo.team = -1;
haiku_cleanup_thread_list(&sTeamDebugInfo); haiku_cleanup_thread_list(&sTeamDebugInfo);
haiku_cleanup_image_list(&sTeamDebugInfo); haiku_cleanup_image_list(&sTeamDebugInfo);
} }
@@ -759,7 +759,7 @@ haiku_stop_thread(team_debug_info *teamDebugInfo, thread_id threadID)
// We should check, whether we really got an event for the thread in // We should check, whether we really got an event for the thread in
// question, but the only possible other event is that the team has // question, but the only possible other event is that the team has
// been delete, which ends the game anyway. // been delete, which ends the game anyway.
// TODO: That's actually not true. We also get messages when an add-on // TODO: That's actually not true. We also get messages when an add-on
// has been loaded/unloaded, a signal arrives, or a thread calls the // has been loaded/unloaded, a signal arrives, or a thread calls the
// debugger. // debugger.
@@ -1008,7 +1008,7 @@ haiku_child_resume (ptid_t ptid, int step, enum target_signal sig)
static ptid_t static ptid_t
haiku_child_wait_internal (team_debug_info *teamDebugInfo, ptid_t ptid, haiku_child_wait_internal (team_debug_info *teamDebugInfo, ptid_t ptid,
struct target_waitstatus *ourstatus, bool *ignore) struct target_waitstatus *ourstatus, bool *ignore, bool *selectThread)
{ {
team_id teamID = ptid_get_pid(ptid); team_id teamID = ptid_get_pid(ptid);
team_id threadID = ptid_get_tid(ptid); team_id threadID = ptid_get_tid(ptid);
@@ -1019,6 +1019,8 @@ haiku_child_wait_internal (team_debug_info *teamDebugInfo, ptid_t ptid,
pending_signal_status pendingSignalStatus = SIGNAL_FAKED; pending_signal_status pendingSignalStatus = SIGNAL_FAKED;
int reprocessEvent = -1; int reprocessEvent = -1;
*selectThread = false;
if (teamID < 0 || threadID == 0) if (teamID < 0 || threadID == 0)
threadID = -1; threadID = -1;
@@ -1253,6 +1255,23 @@ TRACE(("haiku_child_wait_internal(): B_APP_IMAGE created, reprocess -> exec\n"))
ourstatus->value.integer = 0; ourstatus->value.integer = 0;
break; break;
case B_DEBUGGER_MESSAGE_HANDED_OVER:
{
TRACE(("haiku_child_wait_internal(): B_DEBUGGER_MESSAGE_HANDED_OVER: causing "
"thread: %ld\n", event->data.handed_over.causing_thread));
// The debugged team has been handed over to us by another debugger
// (likely the debug server). This event also tells us, which
// thread has caused the original debugger to be installed (if any).
// So, if we're not looking for any particular thread, select that
// thread.
if (threadID < 0 && event->data.handed_over.causing_thread >= 0) {
*selectThread = true;
retval = ptid_build(event->data.origin.team, 0,
event->data.handed_over.causing_thread);
}
*ignore = true;
}
default: default:
// unknown message, ignore // unknown message, ignore
*ignore = true; *ignore = true;
@@ -1294,13 +1313,16 @@ haiku_child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
{ {
ptid_t retval; ptid_t retval;
bool ignore = true; bool ignore = true;
bool selectThread = false;
TRACE(("haiku_child_wait(`%s', %p)\n", TRACE(("haiku_child_wait(`%s', %p)\n",
haiku_pid_to_str(ptid), ourstatus)); haiku_pid_to_str(ptid), ourstatus));
do { do {
retval = haiku_child_wait_internal(&sTeamDebugInfo, ptid, ourstatus, retval = haiku_child_wait_internal(&sTeamDebugInfo, ptid, ourstatus,
&ignore); &ignore, &selectThread);
if (selectThread)
ptid = retval;
} while (ignore); } while (ignore);
TRACE(("haiku_child_wait() done: `%s'\n", haiku_pid_to_str(retval))); TRACE(("haiku_child_wait() done: `%s'\n", haiku_pid_to_str(retval)));
@@ -1556,7 +1578,7 @@ haiku_init_debug_create_inferior(int pid)
//"message\n")); //"message\n"));
// break; // break;
// } // }
// //
// resume (0, stop_signal); // resume (0, stop_signal);
// } // }
} }