* Introduced a new debugger message B_DEBUGGER_MESSAGE_HANDED_OVER, which
is sent to a debugger when the debugged team has been successfully handed over to another debugger. * Fixed handling of B_DEBUG_MESSAGE_PREPARE_HANDOVER. We don't send a reply. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13683 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -153,6 +153,9 @@ typedef enum {
|
|||||||
B_DEBUGGER_MESSAGE_THREAD_DELETED, // a thread has been deleted
|
B_DEBUGGER_MESSAGE_THREAD_DELETED, // a thread has been deleted
|
||||||
B_DEBUGGER_MESSAGE_IMAGE_CREATED, // an image has been created
|
B_DEBUGGER_MESSAGE_IMAGE_CREATED, // an image has been created
|
||||||
B_DEBUGGER_MESSAGE_IMAGE_DELETED, // an image has been deleted
|
B_DEBUGGER_MESSAGE_IMAGE_DELETED, // an image has been deleted
|
||||||
|
|
||||||
|
B_DEBUGGER_MESSAGE_HANDED_OVER, // the debugged team has been
|
||||||
|
// handed over to another debugger
|
||||||
} debug_debugger_message;
|
} debug_debugger_message;
|
||||||
|
|
||||||
|
|
||||||
@@ -327,9 +330,7 @@ typedef struct {
|
|||||||
|
|
||||||
// B_DEBUG_MESSAGE_PREPARE_HANDOVER
|
// B_DEBUG_MESSAGE_PREPARE_HANDOVER
|
||||||
|
|
||||||
typedef struct {
|
// no parameters, no reply
|
||||||
status_t error; // B_OK, if the everything went fine
|
|
||||||
} debug_nub_prepare_handover_reply;
|
|
||||||
|
|
||||||
// union of all messages structures sent to the debug nub thread
|
// union of all messages structures sent to the debug nub thread
|
||||||
typedef union {
|
typedef union {
|
||||||
@@ -480,6 +481,15 @@ typedef struct {
|
|||||||
image_info info; // info for the image
|
image_info info; // info for the image
|
||||||
} debug_image_deleted;
|
} debug_image_deleted;
|
||||||
|
|
||||||
|
// B_DEBUGGER_MESSAGE_HANDED_OVER
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
debug_origin origin; // thread is < 0, team is the deleted team
|
||||||
|
// (asynchronous message)
|
||||||
|
team_id debugger; // the new debugger
|
||||||
|
port_id debugger_port; // the port the new debugger uses
|
||||||
|
} debug_handed_over;
|
||||||
|
|
||||||
// union of all messages structures sent to the debugger
|
// union of all messages structures sent to the debugger
|
||||||
typedef union {
|
typedef union {
|
||||||
debug_thread_debugged thread_debugged;
|
debug_thread_debugged thread_debugged;
|
||||||
@@ -497,6 +507,7 @@ typedef union {
|
|||||||
debug_thread_deleted thread_deleted;
|
debug_thread_deleted thread_deleted;
|
||||||
debug_image_created image_created;
|
debug_image_created image_created;
|
||||||
debug_image_deleted image_deleted;
|
debug_image_deleted image_deleted;
|
||||||
|
debug_handed_over handed_over;
|
||||||
|
|
||||||
debug_origin origin; // for convenience (no real message)
|
debug_origin origin; // for convenience (no real message)
|
||||||
} debug_debugger_message_data;
|
} debug_debugger_message_data;
|
||||||
|
|||||||
@@ -1214,7 +1214,6 @@ debug_nub_thread(void *)
|
|||||||
debug_nub_set_watchpoint_reply set_watchpoint;
|
debug_nub_set_watchpoint_reply set_watchpoint;
|
||||||
debug_nub_get_signal_masks_reply get_signal_masks;
|
debug_nub_get_signal_masks_reply get_signal_masks;
|
||||||
debug_nub_get_signal_handler_reply get_signal_handler;
|
debug_nub_get_signal_handler_reply get_signal_handler;
|
||||||
debug_nub_prepare_handover_reply prepare_handover;
|
|
||||||
} reply;
|
} reply;
|
||||||
int32 replySize = 0;
|
int32 replySize = 0;
|
||||||
port_id replyPort = -1;
|
port_id replyPort = -1;
|
||||||
@@ -1731,14 +1730,9 @@ debug_nub_thread(void *)
|
|||||||
release_sem(writeLock);
|
release_sem(writeLock);
|
||||||
} else {
|
} else {
|
||||||
// We probably got a SIGKILL. If so, we will terminate when
|
// We probably got a SIGKILL. If so, we will terminate when
|
||||||
// sending the reply fails.
|
// reading the next message fails.
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepare the reply
|
|
||||||
reply.prepare_handover.error = result;
|
|
||||||
replySize = sizeof(reply.prepare_handover);
|
|
||||||
sendReply = true;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1760,6 +1754,9 @@ debug_nub_thread(void *)
|
|||||||
if (error != B_OK) {
|
if (error != B_OK) {
|
||||||
// The debugger port is either not longer existing or we got
|
// The debugger port is either not longer existing or we got
|
||||||
// interrupted by a kill signal. In either case we terminate.
|
// interrupted by a kill signal. In either case we terminate.
|
||||||
|
TRACE(("nub thread %ld: failed to send reply to port %ld: %s\n",
|
||||||
|
nubThread->id, replyPort, strerror(error)));
|
||||||
|
|
||||||
nub_thread_cleanup(nubThread);
|
nub_thread_cleanup(nubThread);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@@ -1843,6 +1840,7 @@ install_team_debugger(team_id teamID, port_id debuggerPort, bool useDefault,
|
|||||||
bool done = false;
|
bool done = false;
|
||||||
port_id result = B_ERROR;
|
port_id result = B_ERROR;
|
||||||
bool handOver = false;
|
bool handOver = false;
|
||||||
|
port_id oldDebuggerPort = -1;
|
||||||
port_id nubPort = -1;
|
port_id nubPort = -1;
|
||||||
|
|
||||||
cpu_status state = disable_interrupts();
|
cpu_status state = disable_interrupts();
|
||||||
@@ -1871,6 +1869,7 @@ install_team_debugger(team_id teamID, port_id debuggerPort, bool useDefault,
|
|||||||
atomic_and(& team->debug_info.flags,
|
atomic_and(& team->debug_info.flags,
|
||||||
~B_TEAM_DEBUG_DEBUGGER_HANDOVER);
|
~B_TEAM_DEBUG_DEBUGGER_HANDOVER);
|
||||||
|
|
||||||
|
oldDebuggerPort = team->debug_info.debugger_port;
|
||||||
result = nubPort = team->debug_info.nub_port;
|
result = nubPort = team->debug_info.nub_port;
|
||||||
|
|
||||||
// set the new debugger
|
// set the new debugger
|
||||||
@@ -1902,6 +1901,22 @@ install_team_debugger(team_id teamID, port_id debuggerPort, bool useDefault,
|
|||||||
kill_interruptable_write_port(nubPort, B_DEBUG_MESSAGE_HANDED_OVER,
|
kill_interruptable_write_port(nubPort, B_DEBUG_MESSAGE_HANDED_OVER,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
|
|
||||||
|
// notify the old debugger
|
||||||
|
debug_handed_over notification;
|
||||||
|
notification.origin.thread = -1;
|
||||||
|
notification.origin.team = teamID;
|
||||||
|
notification.origin.nub_port = nubPort;
|
||||||
|
notification.debugger = debuggerTeam;
|
||||||
|
notification.debugger_port = debuggerPort;
|
||||||
|
|
||||||
|
error = write_port_etc(oldDebuggerPort,
|
||||||
|
B_DEBUGGER_MESSAGE_HANDED_OVER, ¬ification,
|
||||||
|
sizeof(notification), B_RELATIVE_TIMEOUT, 0);
|
||||||
|
if (error != B_OK) {
|
||||||
|
TRACE(("install_team_debugger(): Failed to send message to old "
|
||||||
|
"debugger: %s\n", strerror(error)));
|
||||||
|
}
|
||||||
|
|
||||||
TRACE(("install_team_debugger() done: handed over to debugger: team: "
|
TRACE(("install_team_debugger() done: handed over to debugger: team: "
|
||||||
"%ld, port: %ld\n", debuggerTeam, debuggerPort));
|
"%ld, port: %ld\n", debuggerTeam, debuggerPort));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user