Index: runtime/vm/dart_api_impl.cc |
=================================================================== |
--- runtime/vm/dart_api_impl.cc (revision 3557) |
+++ runtime/vm/dart_api_impl.cc (working copy) |
@@ -15,6 +15,7 @@ |
#include "vm/exceptions.h" |
#include "vm/growable_array.h" |
#include "vm/longjump.h" |
+#include "vm/message_queue.h" |
#include "vm/native_entry.h" |
#include "vm/object.h" |
#include "vm/object_store.h" |
@@ -201,11 +202,6 @@ |
} |
-Dart_Message Api::CastMessage(uint8_t* message) { |
- return reinterpret_cast<Dart_Message>(message); |
-} |
- |
- |
Dart_Handle Api::Success() { |
Isolate* isolate = Isolate::Current(); |
ASSERT(isolate != NULL); |
@@ -628,15 +624,11 @@ |
// --- Messages and Ports --- |
-DART_EXPORT void Dart_SetMessageCallbacks( |
- Dart_PostMessageCallback post_message_callback, |
- Dart_ClosePortCallback close_port_callback) { |
+DART_EXPORT void Dart_SetMessageNotifyCallback( |
+ Dart_MessageNotifyCallback message_notify_callback) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
- ASSERT(post_message_callback != NULL); |
- ASSERT(close_port_callback != NULL); |
- isolate->set_post_message_callback(post_message_callback); |
- isolate->set_close_port_callback(close_port_callback); |
+ isolate->set_message_notify_callback(message_notify_callback); |
} |
@@ -677,20 +669,35 @@ |
} |
-DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port_id, |
- Dart_Port reply_port_id, |
- Dart_Message dart_message) { |
- DARTSCOPE(Isolate::Current()); |
- const Instance& msg = Instance::Handle(DeserializeMessage(dart_message)); |
- // TODO(turnidge): Should this call be wrapped in a longjmp? |
- const Object& result = |
- Object::Handle(DartLibraryCalls::HandleMessage(dest_port_id, |
- reply_port_id, |
- msg)); |
- if (result.IsError()) { |
- return Api::NewLocalHandle(result); |
- } |
- ASSERT(result.IsNull()); |
+DART_EXPORT Dart_Handle Dart_HandleMessage() { |
+ Isolate* isolate = Isolate::Current(); |
+ // Process all OOB messages and at most one normal message. |
+ Message* message = NULL; |
+ Message::Priority priority = Message::kNormalPriority; |
+ do { |
+ DARTSCOPE(isolate); |
+ message = isolate->message_queue()->DequeueNoWait(); |
+ if (message == NULL) { |
+ break; |
+ } |
+ priority = message->priority(); |
+ if (priority == Message::kOOBPriority) { |
+ // TODO(turnidge): Out of band messages will not go through the |
+ // regular message handler. Instead they will be dispatched to |
+ // special vm code. Implement. |
+ UNIMPLEMENTED(); |
+ } |
+ const Instance& msg = |
+ Instance::Handle(DeserializeMessage(message->data())); |
+ const Object& result = Object::Handle( |
+ DartLibraryCalls::HandleMessage( |
+ message->dest_port(), message->reply_port(), msg)); |
+ delete message; |
+ if (result.IsError()) { |
+ return Api::NewLocalHandle(result); |
+ } |
+ ASSERT(result.IsNull()); |
+ } while (priority >= Message::kOOBPriority); |
return Api::Success(); |
} |
@@ -717,7 +724,8 @@ |
writer.WriteMessage(len, data); |
// Post the message at the given port. |
- return PortMap::PostMessage(port_id, kNoReplyPort, Api::CastMessage(buffer)); |
+ return PortMap::PostMessage(new Message( |
+ port_id, Message::kIllegalPort, buffer, Message::kNormalPriority)); |
} |
@@ -730,7 +738,8 @@ |
SnapshotWriter writer(Snapshot::kMessage, &data, &allocator); |
writer.WriteObject(object.raw()); |
writer.FinalizeBuffer(); |
- return PortMap::PostMessage(port_id, kNoReplyPort, Api::CastMessage(data)); |
+ return PortMap::PostMessage(new Message( |
+ port_id, Message::kIllegalPort, data, Message::kNormalPriority)); |
} |