| Index: runtime/bin/dbg_message.h
|
| ===================================================================
|
| --- runtime/bin/dbg_message.h (revision 13208)
|
| +++ runtime/bin/dbg_message.h (working copy)
|
| @@ -121,20 +121,34 @@
|
|
|
|
|
| // Class which represents a queue of debug command messages sent to an isolate.
|
| -class DbgMessageQueue {
|
| +class DbgMsgQueue {
|
| public:
|
| - static const int32_t kInvalidCommand = -1;
|
| -
|
| - DbgMessageQueue() : is_running_(true),
|
| - is_interrupted_(false),
|
| - msglist_head_(NULL),
|
| - msglist_tail_(NULL),
|
| - queued_output_messages_(64) {
|
| + DbgMsgQueue(Dart_IsolateId isolate_id, DbgMsgQueue* next)
|
| + : is_running_(true),
|
| + is_interrupted_(false),
|
| + msglist_head_(NULL),
|
| + msglist_tail_(NULL),
|
| + queued_output_messages_(64),
|
| + isolate_id_(isolate_id),
|
| + next_(next) {
|
| }
|
| - ~DbgMessageQueue() {
|
| - // Cleanup the message queue
|
| + ~DbgMsgQueue() {
|
| + DbgMessage* msg = msglist_head_;
|
| + while (msglist_head_ != NULL) {
|
| + msglist_head_ = msglist_head_->next();
|
| + delete msg;
|
| + msg = msglist_head_;
|
| + }
|
| + msglist_tail_ = NULL;
|
| + isolate_id_ = ILLEGAL_ISOLATE_ID;
|
| + next_ = NULL;
|
| }
|
|
|
| + // Accessors.
|
| + Dart_IsolateId isolate_id() const { return isolate_id_; }
|
| + DbgMsgQueue* next() const { return next_; }
|
| + void set_next(DbgMsgQueue* next) { next_ = next; }
|
| +
|
| // Add specified debug command message to the queue.
|
| void AddMessage(int32_t cmd_idx,
|
| const char* start,
|
| @@ -144,6 +158,9 @@
|
| // Handle all debug command messages in the queue.
|
| void HandleMessages();
|
|
|
| + // Interrupt Isolate.
|
| + void InterruptIsolate();
|
| +
|
| // Queue output messages, these are sent out when we hit an event.
|
| void QueueOutputMsg(dart::TextBuffer* msg);
|
|
|
| @@ -156,6 +173,36 @@
|
| // Send Exception event message over to the debugger.
|
| void SendExceptionEvent(Dart_Handle exception, Dart_StackTrace trace);
|
|
|
| + // Send Isolate event message over to the debugger.
|
| + void SendIsolateEvent(Dart_IsolateId isolate_id, Dart_IsolateEvent kind);
|
| +
|
| + private:
|
| + bool is_running_; // True if isolate is running and not in the debugger loop.
|
| + bool is_interrupted_; // True if interrupt command is pending.
|
| +
|
| + DbgMessage* msglist_head_; // Start of debugger messages list.
|
| + DbgMessage* msglist_tail_; // End of debugger messages list.
|
| +
|
| + // Text buffer that accumulates messages to be output.
|
| + dart::TextBuffer queued_output_messages_;
|
| +
|
| + Dart_IsolateId isolate_id_; // Id of the isolate tied to this queue.
|
| +
|
| + DbgMsgQueue* next_; // Used for creating a list of message queues.
|
| +
|
| + // The isolate waits on this condition variable when it needs to process
|
| + // debug messages.
|
| + dart::Monitor msg_queue_lock_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DbgMsgQueue);
|
| +};
|
| +
|
| +
|
| +// Maintains a list of message queues.
|
| +class DbgMsgQueueList {
|
| + public:
|
| + static const int32_t kInvalidCommand = -1;
|
| +
|
| // Initialize the message queue processing by setting up the appropriate
|
| // handlers.
|
| static void Initialize();
|
| @@ -165,35 +212,36 @@
|
| // It returns kInvalidCommand otherwise.
|
| static int32_t LookupIsolateCommand(const char* buf, int32_t buflen);
|
|
|
| + // Add Debugger Message Queue corresponding to the Isolate.
|
| + static DbgMsgQueue* AddIsolateMsgQueue(Dart_IsolateId isolate_id);
|
| +
|
| // Get Debugger Message Queue corresponding to the Isolate.
|
| - static DbgMessageQueue* GetIsolateMessageQueue(Dart_Isolate isolate);
|
| + static DbgMsgQueue* GetIsolateMsgQueue(Dart_IsolateId isolate_id);
|
|
|
| + // Remove Debugger Message Queue corresponding to the Isolate.
|
| + static void RemoveIsolateMsgQueue(Dart_IsolateId isolate_id);
|
| +
|
| // Generic handlers for breakpoints, exceptions and delayed breakpoint
|
| // resolution.
|
| - static void BptResolvedHandler(intptr_t bp_id,
|
| + static void BptResolvedHandler(Dart_IsolateId isolate_id,
|
| + intptr_t bp_id,
|
| Dart_Handle url,
|
| intptr_t line_number);
|
| - static void BreakpointHandler(Dart_Breakpoint bpt, Dart_StackTrace trace);
|
| - static void ExceptionThrownHandler(Dart_Handle exception,
|
| + static void BreakpointHandler(Dart_IsolateId isolate_id,
|
| + Dart_Breakpoint bpt,
|
| + Dart_StackTrace trace);
|
| + static void ExceptionThrownHandler(Dart_IsolateId isolate_id,
|
| + Dart_Handle exception,
|
| Dart_StackTrace stack_trace);
|
| static void IsolateEventHandler(Dart_IsolateId isolate_id,
|
| Dart_IsolateEvent kind);
|
|
|
| private:
|
| - bool is_running_; // True if isolate is running and not in the debugger loop.
|
| - bool is_interrupted_; // True if interrupt command is pending.
|
| + static DbgMsgQueue* list_;
|
| + static dart::Mutex msg_queue_list_lock_;
|
|
|
| - DbgMessage* msglist_head_; // Start of debugger messages list.
|
| - DbgMessage* msglist_tail_; // End of debugger messages list.
|
| -
|
| - // Text buffer that accumulates messages to be output.
|
| - dart::TextBuffer queued_output_messages_;
|
| -
|
| - // The waits on this condition variable when it needs to process
|
| - // debug messages.
|
| - dart::Monitor msg_queue_lock_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DbgMessageQueue);
|
| + DISALLOW_ALLOCATION();
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(DbgMsgQueueList);
|
| };
|
|
|
| #endif // BIN_DBG_MESSAGE_H_
|
|
|