Index: runtime/vm/message.cc |
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc |
index ea9b9861425510f59e1b38ca9e79ab209aad79b7..90335d101203ed6262c6349097728a6832ccaa31 100644 |
--- a/runtime/vm/message.cc |
+++ b/runtime/vm/message.cc |
@@ -4,6 +4,9 @@ |
#include "vm/message.h" |
+#include "vm/dart_entry.h" |
+#include "vm/json_stream.h" |
+#include "vm/object.h" |
#include "vm/port.h" |
namespace dart { |
@@ -18,6 +21,26 @@ bool Message::RedirectToDeliveryFailurePort() { |
} |
+intptr_t Message::Id() const { |
+ // Messages are allocated on the C heap. Use the raw address as the id. |
+ return reinterpret_cast<intptr_t>(this); |
+} |
+ |
+const char* Message::PriorityAsString(Priority priority) { |
+ switch (priority) { |
+ case kNormalPriority: |
+ return "Normal"; |
+ break; |
+ case kOOBPriority: |
+ return "OOB"; |
+ break; |
+ default: |
+ UNIMPLEMENTED(); |
+ return NULL; |
+ } |
+} |
+ |
+ |
MessageQueue::MessageQueue() { |
head_ = NULL; |
tail_ = NULL; |
@@ -106,4 +129,98 @@ void MessageQueue::Clear() { |
} |
+MessageQueue::Iterator::Iterator(const MessageQueue* queue) |
+ : current_(NULL), |
+ queue_(queue) { |
+ Reset(queue); |
+} |
+ |
+ |
+MessageQueue::Iterator::~Iterator() { |
+} |
+ |
+void MessageQueue::Iterator::Reset(const MessageQueue* queue) { |
+ queue_ = queue; |
+ if (queue_ == NULL) { |
+ current_ = NULL; |
+ return; |
+ } |
+ current_ = queue_->head_; |
+} |
+ |
+// returns false when iterator has reached end of message queue. |
+bool MessageQueue::Iterator::HasNext() { |
+ return current() != NULL; |
+} |
+ |
+// Moves forward and then returns current(). |
+Message* MessageQueue::Iterator::Next() { |
+ if (!HasNext()) { |
+ return current(); |
turnidge
2015/05/04 17:47:13
Your Next() and HasNext() are a bit different than
Cutch
2015/05/04 19:56:51
Done.
|
+ } |
+ current_ = current_->next_; |
+ return current(); |
+} |
+ |
+ |
+intptr_t MessageQueue::Length() const { |
+ MessageQueue::Iterator it(this); |
+ intptr_t length = 0; |
+ for (; it.HasNext(); it.Next()) { |
+ length++; |
+ } |
+ return length; |
+} |
+ |
+ |
+Message* MessageQueue::FindMessageById(intptr_t id) { |
+ MessageQueue::Iterator it(this); |
+ for (; it.HasNext(); it.Next()) { |
+ Message* message = it.current(); |
+ ASSERT(message != NULL); |
+ if (message->Id() == id) { |
+ return message; |
+ } |
+ } |
+ return NULL; |
+} |
+ |
+ |
+void MessageQueue::PrintJSON(JSONStream* stream) { |
+ Isolate* isolate = Isolate::Current(); |
+ JSONArray messages(stream); |
+ |
+ MessageQueue::Iterator it(this); |
+ intptr_t depth = 0; |
+ |
+ Object& msg_handler = Object::Handle(isolate); |
+ for (; it.HasNext(); it.Next()) { |
+ Message* current = it.current(); |
+ JSONObject message(&messages); |
+ message.AddProperty("type", "IsolateMessage"); |
turnidge
2015/05/04 17:47:13
IsolateMessage? I don't like the "Isolate". Mayb
Cutch
2015/05/04 19:56:51
Done.
|
+ message.AddPropertyF("name", "Isolate Message (%" Px ")", current->Id()); |
+ message.AddPropertyF("messageObjectId", "messages/0x%" Px "", |
+ current->Id()); |
+ message.AddProperty("size", current->len()); |
+ message.AddProperty("depth", depth++); |
+ message.AddProperty("destinationPort", |
turnidge
2015/05/04 17:47:13
Make this _destinationPort.
Cutch
2015/05/04 19:56:51
Done.
|
+ static_cast<intptr_t>(current->dest_port())); |
+ message.AddProperty("priority", |
+ Message::PriorityAsString(current->priority())); |
+ msg_handler = DartLibraryCalls::LookupHandler(current->dest_port()); |
turnidge
2015/05/04 17:47:13
Add a TODO to move this map into the VM so we can
Cutch
2015/05/04 19:56:51
Done.
|
+ if (msg_handler.IsInstance() && Instance::Cast(msg_handler).IsClosure()) { |
+ // Grab function from closure. |
+ msg_handler = Closure::function(Instance::Cast(msg_handler)); |
+ } |
+ if (!msg_handler.IsFunction()) { |
+ // No handler function. |
+ continue; |
+ } |
+ const Function& function = Function::Cast(msg_handler); |
+ const Script& script = Script::Handle(isolate, function.script()); |
+ message.AddProperty("handlerFunction", function); |
+ message.AddProperty("handlerScript", script); |
turnidge
2015/05/04 17:47:13
Consider dropping handlerScript. Up to you.
Cutch
2015/05/04 19:56:51
Done.
|
+ } |
+} |
+ |
} // namespace dart |