Index: runtime/vm/message.cc |
=================================================================== |
--- runtime/vm/message.cc (revision 3603) |
+++ runtime/vm/message.cc (working copy) |
@@ -2,10 +2,76 @@ |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
-#include "vm/message_queue.h" |
+#include "vm/message.h" |
namespace dart { |
+DECLARE_FLAG(bool, trace_isolates); |
+ |
+ |
+MessageHandler::MessageHandler() |
+ : live_ports_(0), |
+ queue_(new MessageQueue()) { |
+ ASSERT(queue_ != NULL); |
+} |
+ |
+ |
+MessageHandler::~MessageHandler() { |
+ delete queue_; |
+} |
+ |
+ |
+const char* MessageHandler::name() const { |
+ return "<unnamed>"; |
+} |
+ |
+ |
+#if defined(DEBUG) |
+void MessageHandler::CheckAccess() { |
+ // By default there is no checking. |
+} |
+#endif |
+ |
+ |
+void MessageHandler::MessageNotify(Message::Priority priority) { |
+ // By default, there is no custom message notification. |
+} |
+ |
+ |
+void MessageHandler::PostMessage(Message* message) { |
+ if (FLAG_trace_isolates) { |
+ const char* source_name = "<native code>"; |
+ Isolate* source_isolate = Isolate::Current(); |
+ if (source_isolate) { |
+ source_name = source_isolate->name(); |
+ } |
+ OS::Print("[>] Posting message:\n" |
+ "\tsource: %s\n" |
+ "\treply_port: %lld\n" |
+ "\tdest: %s\n" |
+ "\tdest_port: %lld\n", |
+ source_name, message->reply_port(), name(), message->dest_port()); |
+ } |
+ |
+ Message::Priority priority = message->priority(); |
+ queue()->Enqueue(message); |
+ message = NULL; // Do not access message. May have been deleted. |
+ |
+ // Invoke any custom message notification. |
+ MessageNotify(priority); |
+} |
+ |
+ |
+void MessageHandler::ClosePort(Dart_Port port) { |
+ queue()->Flush(port); |
+} |
+ |
+ |
+void MessageHandler::CloseAllPorts() { |
+ queue()->FlushAll(); |
+} |
+ |
+ |
MessageQueue::MessageQueue() { |
for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) { |
head_[p] = NULL; |
@@ -25,11 +91,7 @@ |
void MessageQueue::Enqueue(Message* msg) { |
- // TODO(turnidge): Add a scoped locker for monitors which is not a |
- // stack resource. This would probably be useful in the platform |
- // headers. |
- monitor_.Enter(); |
- |
+ MonitorLocker ml(&monitor_); |
Message::Priority p = msg->priority(); |
// Make sure messages are not reused. |
ASSERT(msg->next_ == NULL); |
@@ -46,8 +108,6 @@ |
tail_[p]->next_ = msg; |
tail_[p] = msg; |
} |
- |
- monitor_.Exit(); |
} |
Message* MessageQueue::DequeueNoWait() { |
@@ -78,11 +138,10 @@ |
Message* MessageQueue::Dequeue(int64_t millis) { |
ASSERT(millis >= 0); |
MonitorLocker ml(&monitor_); |
- |
Message* result = DequeueNoWaitHoldsLock(); |
if (result == NULL) { |
// No message available at any priority. |
- ml.Wait(millis); |
+ monitor_.Wait(millis); |
result = DequeueNoWaitHoldsLock(); |
} |
return result; |