Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl.cc (revision 3210) |
| +++ 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" |
| @@ -195,11 +196,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); |
| @@ -667,15 +663,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); |
| } |
| @@ -716,20 +708,30 @@ |
| } |
| -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; |
| + do { |
| + DARTSCOPE(isolate); |
| + message = isolate->message_queue()->DequeueNoWait(); |
| + if (message == NULL) { |
| + break; |
| + } |
| + if (message->priority() == Message::kOOBPriority) { |
| + 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 (message->priority() <= Message::kOOBPriority); |
|
Anton Muhin
2012/01/12 12:58:16
you have deleted message couple of lines above, no
Anton Muhin
2012/01/12 12:58:16
up to you, but it's hard to remember if normal pri
turnidge
2012/01/12 19:01:55
Yikes. Fixed.
turnidge
2012/01/12 19:01:55
Changed to an == for now.
|
| return Api::Success(); |
| } |
| @@ -756,7 +758,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)); |
| } |
| @@ -769,7 +772,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)); |
| } |