| Index: runtime/bin/dbg_message.cc
|
| ===================================================================
|
| --- runtime/bin/dbg_message.cc (revision 31232)
|
| +++ runtime/bin/dbg_message.cc (working copy)
|
| @@ -1017,27 +1017,54 @@
|
| }
|
|
|
|
|
| -void DbgMsgQueue::HandleMessages() {
|
| +void DbgMsgQueue::Notify() {
|
| + MonitorLocker ml(&msg_queue_lock_);
|
| + ml.Notify();
|
| +}
|
| +
|
| +
|
| +bool DbgMsgQueue::HandlePendingMessages() {
|
| + // Handle all available debug messages, up to a resume request.
|
| bool resume_requested = false;
|
| + while (msglist_head_ != NULL && !resume_requested) {
|
| + ASSERT(msglist_tail_ != NULL);
|
| + DbgMessage* msg = msglist_head_;
|
| + msglist_head_ = msglist_head_->next();
|
| + if (msglist_head_ == NULL) {
|
| + msglist_tail_ = NULL;
|
| + }
|
| + resume_requested = msg->HandleMessage();
|
| + delete msg;
|
| + }
|
| + return resume_requested;
|
| +}
|
| +
|
| +
|
| +void DbgMsgQueue::MessageLoop() {
|
| MonitorLocker ml(&msg_queue_lock_);
|
| is_running_ = false;
|
| - while (!resume_requested) {
|
| - while (msglist_head_ == NULL) {
|
| - ASSERT(msglist_tail_ == NULL);
|
| - dart::Monitor::WaitResult res = ml.Wait(); // Wait for debugger commands.
|
| - ASSERT(res == dart::Monitor::kNotified);
|
| +
|
| + // Request notification on isolate messages. This allows us to
|
| + // respond to vm service messages while at breakpoint.
|
| + Dart_SetMessageNotifyCallback(DbgMsgQueueList::NotifyIsolate);
|
| +
|
| + while (true) {
|
| + // Handle all available vm service messages, up to a resume
|
| + // request.
|
| + if (Dart_HandleServiceMessages()) {
|
| + break;
|
| }
|
| - while (msglist_head_ != NULL && !resume_requested) {
|
| - ASSERT(msglist_tail_ != NULL);
|
| - DbgMessage* msg = msglist_head_;
|
| - msglist_head_ = msglist_head_->next();
|
| - resume_requested = msg->HandleMessage();
|
| - delete msg;
|
| +
|
| + // Handle all available debug messages, up to a resume request.
|
| + if (HandlePendingMessages()) {
|
| + break;
|
| }
|
| - if (msglist_head_ == NULL) {
|
| - msglist_tail_ = NULL;
|
| - }
|
| +
|
| + // Wait for more debug or vm service messages.
|
| + dart::Monitor::WaitResult res = ml.Wait();
|
| + ASSERT(res == dart::Monitor::kNotified);
|
| }
|
| + Dart_SetMessageNotifyCallback(NULL);
|
| is_interrupted_ = false;
|
| is_running_ = true;
|
| }
|
| @@ -1177,6 +1204,16 @@
|
| }
|
|
|
|
|
| +void DbgMsgQueueList::NotifyIsolate(Dart_Isolate isolate) {
|
| + MutexLocker ml(msg_queue_list_lock_);
|
| + Dart_IsolateId isolate_id = Dart_GetIsolateId(isolate);
|
| + DbgMsgQueue* queue = DbgMsgQueueList::GetIsolateMsgQueueLocked(isolate_id);
|
| + if (queue != NULL) {
|
| + queue->Notify();
|
| + }
|
| +}
|
| +
|
| +
|
| bool DbgMsgQueueList::InterruptIsolate(Dart_IsolateId isolate_id) {
|
| MutexLocker ml(msg_queue_list_lock_);
|
| DbgMsgQueue* queue = DbgMsgQueueList::GetIsolateMsgQueueLocked(isolate_id);
|
| @@ -1293,7 +1330,7 @@
|
| ASSERT(msg_queue != NULL);
|
| msg_queue->SendQueuedMsgs();
|
| msg_queue->SendBreakpointEvent(bp_id, loc);
|
| - msg_queue->HandleMessages();
|
| + msg_queue->MessageLoop();
|
| Dart_ExitScope();
|
| }
|
|
|
| @@ -1307,7 +1344,7 @@
|
| ASSERT(msg_queue != NULL);
|
| msg_queue->SendQueuedMsgs();
|
| msg_queue->SendExceptionEvent(exception, stack_trace);
|
| - msg_queue->HandleMessages();
|
| + msg_queue->MessageLoop();
|
| Dart_ExitScope();
|
| }
|
|
|
| @@ -1325,7 +1362,7 @@
|
| msg_queue->SendQueuedMsgs();
|
| msg_queue->SendIsolateEvent(isolate_id, kind);
|
| if (kind == kInterrupted) {
|
| - msg_queue->HandleMessages();
|
| + msg_queue->MessageLoop();
|
| } else {
|
| ASSERT(kind == kShutdown);
|
| RemoveIsolateMsgQueue(isolate_id);
|
|
|