Index: runtime/vm/dart_api_impl.cc |
=================================================================== |
--- runtime/vm/dart_api_impl.cc (revision 5987) |
+++ runtime/vm/dart_api_impl.cc (working copy) |
@@ -765,7 +765,12 @@ |
DART_EXPORT Dart_Handle Dart_RunLoop() { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
- const Object& obj = Object::Handle(isolate->StandardRunLoop()); |
+ { |
+ SetIsolateScope set_scope(NULL); |
+ isolate->message_handler()->RunBlocking(Dart::thread_pool(), NULL, NULL); |
+ } |
+ const Object& obj = Object::Handle(isolate->object_store()->sticky_error()); |
+ isolate->object_store()->clear_sticky_error(); |
if (obj.IsError()) { |
return Api::NewLocalHandle(obj); |
} |
@@ -774,56 +779,17 @@ |
} |
-static RawInstance* DeserializeMessage(void* data) { |
- // Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(data); |
- ASSERT(snapshot->IsMessageSnapshot()); |
- |
- // Read object back from the snapshot. |
- SnapshotReader reader(snapshot, Isolate::Current()); |
- Instance& instance = Instance::Handle(); |
- instance ^= reader.ReadObject(); |
- return instance.raw(); |
-} |
- |
- |
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); |
- // TODO(turnidge): This code is duplicated elsewhere. Consolidate. |
- message = isolate->message_handler()->queue()->DequeueNoWait(); |
- if (message == NULL) { |
- break; |
- } |
- const Instance& msg = |
- Instance::Handle(DeserializeMessage(message->data())); |
- priority = message->priority(); |
- if (priority == Message::kOOBPriority) { |
- // For now the only OOB messages are Mirrors messages. |
- const Object& result = Object::Handle( |
- DartLibraryCalls::HandleMirrorsMessage( |
- message->dest_port(), message->reply_port(), msg)); |
- delete message; |
- if (result.IsError()) { |
- // TODO(turnidge): Propagating the error is probably wrong here. |
- return Api::NewLocalHandle(result); |
- } |
- ASSERT(result.IsNull()); |
- } else { |
- 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); |
+ CHECK_ISOLATE(isolate); |
+ if (!isolate->message_handler()->HandleNextMessage()) { |
+ Zone zone(isolate); |
+ HANDLESCOPE(isolate); |
+ const Error& error = |
+ Error::Handle(isolate->object_store()->sticky_error()); |
+ ASSERT(!error.IsNull()); |
+ return Api::NewLocalHandle(error); |
+ } |
return Api::Success(); |
} |
@@ -897,7 +863,7 @@ |
NativeMessageHandler* nmh = new NativeMessageHandler(name, handler); |
Dart_Port port_id = PortMap::CreatePort(nmh); |
- nmh->StartWorker(); |
+ nmh->Run(Dart::thread_pool(), NULL, NULL); |
return port_id; |
} |