Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Unified Diff: runtime/bin/dbg_connection.cc

Issue 11028040: - Add support to interrupt a running isolate (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/bin/dbg_connection.cc
===================================================================
--- runtime/bin/dbg_connection.cc (revision 13208)
+++ runtime/bin/dbg_connection.cc (working copy)
@@ -167,7 +167,7 @@
}
-typedef void (*CommandHandler)(DebuggerConnectionHandler* handler);
+typedef void (*CommandHandler)(DbgMessage* msg);
struct JSONDebuggerCommand {
const char* cmd_string;
@@ -179,7 +179,6 @@
static JSONDebuggerCommand generic_debugger_commands[] = {
{ "interrupt", HandleInterruptCmd },
{ "isolates", HandleIsolatesListCmd },
- { "quit", HandleQuitCmd },
{ NULL, NULL }
};
@@ -208,23 +207,30 @@
bool is_handled = false;
while (generic_debugger_commands[i].cmd_string != NULL) {
if (r.IsStringLiteral(generic_debugger_commands[i].cmd_string)) {
- (*generic_debugger_commands[i].handler_function)(this);
+ DbgMessage* msg = new DbgMessage(i,
+ msgbuf_->buf(),
+ r.EndOfObject(),
+ debug_fd_);
+ (*generic_debugger_commands[i].handler_function)(msg);
is_handled = true;
msgbuf_->PopMessage();
+ delete msg;
break;
}
i++;
}
if (!is_handled) {
// Check if this is an isolate specific command.
- int32_t cmd_idx = DbgMessageQueue::LookupIsolateCommand(r.ValueChars(),
+ int32_t cmd_idx = DbgMsgQueueList::LookupIsolateCommand(r.ValueChars(),
r.ValueLen());
- if (cmd_idx != DbgMessageQueue::kInvalidCommand) {
+ if (cmd_idx != DbgMsgQueueList::kInvalidCommand) {
// Get debug message queue corresponding to isolate.
- // TODO(asiva): Need to read the isolate id, map it to the appropriate
- // isolate and pass it down to GetIsolateMessageQueue to get the
- // appropriate debug message queue.
- DbgMessageQueue* queue = DbgMessageQueue::GetIsolateMessageQueue(NULL);
+ // TODO(asiva): Once we have support for including the isolate id
+ // in the debug wire protocol we need to read the isolate id and
+ // pass it down to GetIsolateMsgQueue to get the appropriate debug
+ // message queue.
+ DbgMsgQueue* queue =
+ DbgMsgQueueList::GetIsolateMsgQueue(ILLEGAL_ISOLATE_ID);
ASSERT(queue != NULL);
queue->AddMessage(cmd_idx, msgbuf_->buf(), r.EndOfObject(), debug_fd_);
msgbuf_->PopMessage();
@@ -270,7 +276,7 @@
}
// First setup breakpoint, exception and delayed breakpoint handlers.
- DbgMessageQueue::Initialize();
+ DbgMsgQueueList::Initialize();
// Now setup a listener socket and start a thread which will
// listen, accept connections from debuggers, read and handle/dispatch
@@ -362,30 +368,32 @@
}
-void DebuggerConnectionHandler::HandleInterruptCmd(
- DebuggerConnectionHandler* handler) {
- int msg_id = handler->MessageId();
- ASSERT(msg_id >= 0);
- SendError(handler->debug_fd(), msg_id, "interrupt command unimplemented");
+void DebuggerConnectionHandler::HandleInterruptCmd(DbgMessage* in_msg) {
+ MessageParser msg_parser(in_msg->buffer(), in_msg->buffer_len());
+ int msg_id = msg_parser.MessageId();
+ Dart_IsolateId isolate_id =
+ static_cast<Dart_IsolateId>(msg_parser.GetIntParam("isolateId"));
+ if (isolate_id == ILLEGAL_ISOLATE_ID || Dart_GetIsolate(isolate_id) == NULL) {
+ in_msg->SendErrorReply(msg_id, "Invalid isolate specified");
+ return;
+ }
+ DbgMsgQueue* queue = DbgMsgQueueList::GetIsolateMsgQueue(isolate_id);
+ ASSERT(queue != NULL);
+ queue->InterruptIsolate();
+ dart::TextBuffer msg(64);
+ msg.Printf("{ \"id\": %d }", msg_id);
+ in_msg->SendReply(&msg);
}
-void DebuggerConnectionHandler::HandleIsolatesListCmd(
- DebuggerConnectionHandler* handler) {
- int msg_id = handler->MessageId();
+void DebuggerConnectionHandler::HandleIsolatesListCmd(DbgMessage* in_msg) {
+ MessageParser msg_parser(in_msg->buffer(), in_msg->buffer_len());
+ int msg_id = msg_parser.MessageId();
ASSERT(msg_id >= 0);
- SendError(handler->debug_fd(), msg_id, "isolate list command unimplemented");
+ in_msg->SendErrorReply(msg_id, "isolate list command unimplemented");
}
-void DebuggerConnectionHandler::HandleQuitCmd(
- DebuggerConnectionHandler* handler) {
- int msg_id = handler->MessageId();
- ASSERT(msg_id >= 0);
- SendError(handler->debug_fd(), msg_id, "quit command unimplemented");
-}
-
-
void DebuggerConnectionHandler::AddNewDebuggerConnection(int debug_fd) {
// TODO(asiva): Support multiple debugger connections, for now we just
// create one handler, store it in a static variable and use it.

Powered by Google App Engine
This is Rietveld 408576698