Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 9182001: OOB messages and general message refactor. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/dart_api_impl.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "include/dart_api.h" 5 #include "include/dart_api.h"
6 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart.h" 10 #include "vm/dart.h"
11 #include "vm/dart_api_impl.h" 11 #include "vm/dart_api_impl.h"
12 #include "vm/dart_api_state.h" 12 #include "vm/dart_api_state.h"
13 #include "vm/dart_entry.h" 13 #include "vm/dart_entry.h"
14 #include "vm/debuginfo.h" 14 #include "vm/debuginfo.h"
15 #include "vm/exceptions.h" 15 #include "vm/exceptions.h"
16 #include "vm/growable_array.h" 16 #include "vm/growable_array.h"
17 #include "vm/longjump.h" 17 #include "vm/longjump.h"
18 #include "vm/message_queue.h"
18 #include "vm/native_entry.h" 19 #include "vm/native_entry.h"
19 #include "vm/object.h" 20 #include "vm/object.h"
20 #include "vm/object_store.h" 21 #include "vm/object_store.h"
21 #include "vm/port.h" 22 #include "vm/port.h"
22 #include "vm/resolver.h" 23 #include "vm/resolver.h"
23 #include "vm/snapshot.h" 24 #include "vm/snapshot.h"
24 #include "vm/stack_frame.h" 25 #include "vm/stack_frame.h"
25 #include "vm/timer.h" 26 #include "vm/timer.h"
26 #include "vm/verifier.h" 27 #include "vm/verifier.h"
27 28
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 ASSERT(state.IsValidWeakPersistentHandle(object)); 195 ASSERT(state.IsValidWeakPersistentHandle(object));
195 return reinterpret_cast<WeakPersistentHandle*>(object); 196 return reinterpret_cast<WeakPersistentHandle*>(object);
196 } 197 }
197 198
198 199
199 Dart_Isolate Api::CastIsolate(Isolate* isolate) { 200 Dart_Isolate Api::CastIsolate(Isolate* isolate) {
200 return reinterpret_cast<Dart_Isolate>(isolate); 201 return reinterpret_cast<Dart_Isolate>(isolate);
201 } 202 }
202 203
203 204
204 Dart_Message Api::CastMessage(uint8_t* message) {
205 return reinterpret_cast<Dart_Message>(message);
206 }
207
208
209 Dart_Handle Api::Success() { 205 Dart_Handle Api::Success() {
210 Isolate* isolate = Isolate::Current(); 206 Isolate* isolate = Isolate::Current();
211 ASSERT(isolate != NULL); 207 ASSERT(isolate != NULL);
212 ApiState* state = isolate->api_state(); 208 ApiState* state = isolate->api_state();
213 ASSERT(state != NULL); 209 ASSERT(state != NULL);
214 PersistentHandle* true_handle = state->True(); 210 PersistentHandle* true_handle = state->True();
215 return reinterpret_cast<Dart_Handle>(true_handle); 211 return reinterpret_cast<Dart_Handle>(true_handle);
216 } 212 }
217 213
218 214
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); 617 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);
622 } 618 }
623 Isolate* iso = reinterpret_cast<Isolate*>(isolate); 619 Isolate* iso = reinterpret_cast<Isolate*>(isolate);
624 iso->ScheduleInterrupts(Isolate::kApiInterrupt); 620 iso->ScheduleInterrupts(Isolate::kApiInterrupt);
625 } 621 }
626 622
627 623
628 // --- Messages and Ports --- 624 // --- Messages and Ports ---
629 625
630 626
631 DART_EXPORT void Dart_SetMessageCallbacks( 627 DART_EXPORT void Dart_SetMessageNotifyCallback(
632 Dart_PostMessageCallback post_message_callback, 628 Dart_MessageNotifyCallback message_notify_callback) {
633 Dart_ClosePortCallback close_port_callback) {
634 Isolate* isolate = Isolate::Current(); 629 Isolate* isolate = Isolate::Current();
635 CHECK_ISOLATE(isolate); 630 CHECK_ISOLATE(isolate);
636 ASSERT(post_message_callback != NULL); 631 isolate->set_message_notify_callback(message_notify_callback);
637 ASSERT(close_port_callback != NULL);
638 isolate->set_post_message_callback(post_message_callback);
639 isolate->set_close_port_callback(close_port_callback);
640 } 632 }
641 633
642 634
643 DART_EXPORT Dart_Handle Dart_RunLoop() { 635 DART_EXPORT Dart_Handle Dart_RunLoop() {
644 Isolate* isolate = Isolate::Current(); 636 Isolate* isolate = Isolate::Current();
645 DARTSCOPE(isolate); 637 DARTSCOPE(isolate);
646 638
647 LongJump* base = isolate->long_jump_base(); 639 LongJump* base = isolate->long_jump_base();
648 LongJump jump; 640 LongJump jump;
649 Dart_Handle result; 641 Dart_Handle result;
(...skipping 20 matching lines...) Expand all
670 ASSERT(snapshot->IsMessageSnapshot()); 662 ASSERT(snapshot->IsMessageSnapshot());
671 663
672 // Read object back from the snapshot. 664 // Read object back from the snapshot.
673 SnapshotReader reader(snapshot, Isolate::Current()); 665 SnapshotReader reader(snapshot, Isolate::Current());
674 Instance& instance = Instance::Handle(); 666 Instance& instance = Instance::Handle();
675 instance ^= reader.ReadObject(); 667 instance ^= reader.ReadObject();
676 return instance.raw(); 668 return instance.raw();
677 } 669 }
678 670
679 671
680 DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port_id, 672 DART_EXPORT Dart_Handle Dart_HandleMessage() {
681 Dart_Port reply_port_id, 673 Isolate* isolate = Isolate::Current();
682 Dart_Message dart_message) { 674 // Process all OOB messages and at most one normal message.
683 DARTSCOPE(Isolate::Current()); 675 Message* message = NULL;
684 const Instance& msg = Instance::Handle(DeserializeMessage(dart_message)); 676 Message::Priority priority = Message::kNormalPriority;
685 // TODO(turnidge): Should this call be wrapped in a longjmp? 677 do {
686 const Object& result = 678 DARTSCOPE(isolate);
687 Object::Handle(DartLibraryCalls::HandleMessage(dest_port_id, 679 message = isolate->message_queue()->DequeueNoWait();
688 reply_port_id, 680 if (message == NULL) {
689 msg)); 681 break;
690 if (result.IsError()) { 682 }
691 return Api::NewLocalHandle(result); 683 priority = message->priority();
692 } 684 if (priority == Message::kOOBPriority) {
693 ASSERT(result.IsNull()); 685 // TODO(turnidge): Out of band messages will not go through the
686 // regular message handler. Instead they will be dispatched to
687 // special vm code. Implement.
688 UNIMPLEMENTED();
689 }
690 const Instance& msg =
691 Instance::Handle(DeserializeMessage(message->data()));
692 const Object& result = Object::Handle(
693 DartLibraryCalls::HandleMessage(
694 message->dest_port(), message->reply_port(), msg));
695 delete message;
696 if (result.IsError()) {
697 return Api::NewLocalHandle(result);
698 }
699 ASSERT(result.IsNull());
700 } while (priority >= Message::kOOBPriority);
694 return Api::Success(); 701 return Api::Success();
695 } 702 }
696 703
697 704
698 DART_EXPORT bool Dart_HasLivePorts() { 705 DART_EXPORT bool Dart_HasLivePorts() {
699 Isolate* isolate = Isolate::Current(); 706 Isolate* isolate = Isolate::Current();
700 ASSERT(isolate); 707 ASSERT(isolate);
701 return isolate->live_ports() > 0; 708 return isolate->live_ports() > 0;
702 } 709 }
703 710
704 711
705 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 712 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
706 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); 713 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
707 return reinterpret_cast<uint8_t*>(new_ptr); 714 return reinterpret_cast<uint8_t*>(new_ptr);
708 } 715 }
709 716
710 717
711 DART_EXPORT bool Dart_PostIntArray(Dart_Port port_id, 718 DART_EXPORT bool Dart_PostIntArray(Dart_Port port_id,
712 intptr_t len, 719 intptr_t len,
713 intptr_t* data) { 720 intptr_t* data) {
714 uint8_t* buffer = NULL; 721 uint8_t* buffer = NULL;
715 MessageWriter writer(&buffer, &allocator); 722 MessageWriter writer(&buffer, &allocator);
716 723
717 writer.WriteMessage(len, data); 724 writer.WriteMessage(len, data);
718 725
719 // Post the message at the given port. 726 // Post the message at the given port.
720 return PortMap::PostMessage(port_id, kNoReplyPort, Api::CastMessage(buffer)); 727 return PortMap::PostMessage(new Message(
728 port_id, Message::kIllegalPort, buffer, Message::kNormalPriority));
721 } 729 }
722 730
723 731
724 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) { 732 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) {
725 Isolate* isolate = Isolate::Current(); 733 Isolate* isolate = Isolate::Current();
726 CHECK_ISOLATE(isolate); 734 CHECK_ISOLATE(isolate);
727 DARTSCOPE_NOCHECKS(isolate); 735 DARTSCOPE_NOCHECKS(isolate);
728 const Object& object = Object::Handle(Api::UnwrapHandle(handle)); 736 const Object& object = Object::Handle(Api::UnwrapHandle(handle));
729 uint8_t* data = NULL; 737 uint8_t* data = NULL;
730 SnapshotWriter writer(Snapshot::kMessage, &data, &allocator); 738 SnapshotWriter writer(Snapshot::kMessage, &data, &allocator);
731 writer.WriteObject(object.raw()); 739 writer.WriteObject(object.raw());
732 writer.FinalizeBuffer(); 740 writer.FinalizeBuffer();
733 return PortMap::PostMessage(port_id, kNoReplyPort, Api::CastMessage(data)); 741 return PortMap::PostMessage(new Message(
742 port_id, Message::kIllegalPort, data, Message::kNormalPriority));
734 } 743 }
735 744
736 745
737 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) { 746 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) {
738 Isolate* isolate = Isolate::Current(); 747 Isolate* isolate = Isolate::Current();
739 DARTSCOPE(isolate); 748 DARTSCOPE(isolate);
740 const String& class_name = String::Handle(String::NewSymbol("SendPortImpl")); 749 const String& class_name = String::Handle(String::NewSymbol("SendPortImpl"));
741 const String& function_name = String::Handle(String::NewSymbol("_create")); 750 const String& function_name = String::Handle(String::NewSymbol("_create"));
742 const int kNumArguments = 1; 751 const int kNumArguments = 1;
743 const Array& kNoArgumentNames = Array::Handle(); 752 const Array& kNoArgumentNames = Array::Handle();
(...skipping 1721 matching lines...) Expand 10 before | Expand all | Expand 10 after
2465 } 2474 }
2466 delete debug_region; 2475 delete debug_region;
2467 } else { 2476 } else {
2468 *buffer = NULL; 2477 *buffer = NULL;
2469 *buffer_size = 0; 2478 *buffer_size = 0;
2470 } 2479 }
2471 } 2480 }
2472 2481
2473 2482
2474 } // namespace dart 2483 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698