OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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" |
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 | 761 |
762 | 762 |
763 DART_EXPORT void Dart_SetMessageNotifyCallback( | 763 DART_EXPORT void Dart_SetMessageNotifyCallback( |
764 Dart_MessageNotifyCallback message_notify_callback) { | 764 Dart_MessageNotifyCallback message_notify_callback) { |
765 Isolate* isolate = Isolate::Current(); | 765 Isolate* isolate = Isolate::Current(); |
766 CHECK_ISOLATE(isolate); | 766 CHECK_ISOLATE(isolate); |
767 isolate->set_message_notify_callback(message_notify_callback); | 767 isolate->set_message_notify_callback(message_notify_callback); |
768 } | 768 } |
769 | 769 |
770 | 770 |
| 771 struct RunLoopData { |
| 772 Monitor* monitor; |
| 773 bool done; |
| 774 }; |
| 775 |
| 776 |
| 777 static void RunLoopDone(uword param) { |
| 778 RunLoopData* data = reinterpret_cast<RunLoopData*>(param); |
| 779 ASSERT(data->monitor != NULL); |
| 780 MonitorLocker ml(data->monitor); |
| 781 data->done = true; |
| 782 ml.Notify(); |
| 783 } |
| 784 |
| 785 |
771 DART_EXPORT Dart_Handle Dart_RunLoop() { | 786 DART_EXPORT Dart_Handle Dart_RunLoop() { |
772 Isolate* isolate = Isolate::Current(); | 787 Isolate* isolate = Isolate::Current(); |
| 788 |
773 DARTSCOPE(isolate); | 789 DARTSCOPE(isolate); |
774 const Object& obj = Object::Handle(isolate, isolate->StandardRunLoop()); | 790 Monitor monitor; |
| 791 MonitorLocker ml(&monitor); |
| 792 { |
| 793 SwitchIsolateScope switch_scope(NULL); |
| 794 |
| 795 RunLoopData data; |
| 796 data.monitor = &monitor; |
| 797 data.done = false; |
| 798 isolate->message_handler()->Run( |
| 799 Dart::thread_pool(), |
| 800 NULL, RunLoopDone, reinterpret_cast<uword>(&data)); |
| 801 while (!data.done) { |
| 802 ml.Wait(); |
| 803 } |
| 804 } |
| 805 const Object& obj = Object::Handle(isolate->object_store()->sticky_error()); |
| 806 isolate->object_store()->clear_sticky_error(); |
775 if (obj.IsError()) { | 807 if (obj.IsError()) { |
776 return Api::NewHandle(isolate, obj.raw()); | 808 return Api::NewHandle(isolate, obj.raw()); |
777 } | 809 } |
778 ASSERT(obj.IsNull()); | 810 ASSERT(obj.IsNull()); |
779 return Api::Success(isolate); | 811 return Api::Success(isolate); |
780 } | 812 } |
781 | 813 |
782 | 814 |
783 static RawInstance* DeserializeMessage(Isolate* isolate, void* data) { | |
784 // Create a snapshot object using the buffer. | |
785 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data); | |
786 ASSERT(snapshot->IsMessageSnapshot()); | |
787 | |
788 // Read object back from the snapshot. | |
789 SnapshotReader reader(snapshot, isolate); | |
790 Instance& instance = Instance::Handle(isolate); | |
791 instance ^= reader.ReadObject(); | |
792 return instance.raw(); | |
793 } | |
794 | |
795 | |
796 DART_EXPORT Dart_Handle Dart_HandleMessage() { | 815 DART_EXPORT Dart_Handle Dart_HandleMessage() { |
797 Isolate* isolate = Isolate::Current(); | 816 Isolate* isolate = Isolate::Current(); |
798 // Process all OOB messages and at most one normal message. | 817 CHECK_ISOLATE(isolate); |
799 Message* message = NULL; | 818 if (!isolate->message_handler()->HandleNextMessage()) { |
800 Message::Priority priority = Message::kNormalPriority; | 819 // TODO(turnidge): Clear sticky error here? |
801 do { | 820 return Api::NewHandle(isolate, isolate->object_store()->sticky_error()); |
802 DARTSCOPE(isolate); | 821 } |
803 // TODO(turnidge): This code is duplicated elsewhere. Consolidate. | |
804 message = isolate->message_handler()->queue()->DequeueNoWait(); | |
805 if (message == NULL) { | |
806 break; | |
807 } | |
808 const Instance& msg = | |
809 Instance::Handle(isolate, DeserializeMessage(isolate, message->data())); | |
810 priority = message->priority(); | |
811 if (priority == Message::kOOBPriority) { | |
812 // For now the only OOB messages are Mirrors messages. | |
813 const Object& result = Object::Handle( | |
814 isolate, | |
815 DartLibraryCalls::HandleMirrorsMessage( | |
816 message->dest_port(), message->reply_port(), msg)); | |
817 delete message; | |
818 if (result.IsError()) { | |
819 // TODO(turnidge): Propagating the error is probably wrong here. | |
820 return Api::NewHandle(isolate, result.raw()); | |
821 } | |
822 ASSERT(result.IsNull()); | |
823 } else { | |
824 const Object& result = Object::Handle( | |
825 isolate, | |
826 DartLibraryCalls::HandleMessage( | |
827 message->dest_port(), message->reply_port(), msg)); | |
828 delete message; | |
829 if (result.IsError()) { | |
830 return Api::NewHandle(isolate, result.raw()); | |
831 } | |
832 ASSERT(result.IsNull()); | |
833 } | |
834 } while (priority >= Message::kOOBPriority); | |
835 return Api::Success(isolate); | 822 return Api::Success(isolate); |
836 } | 823 } |
837 | 824 |
838 | 825 |
839 DART_EXPORT bool Dart_HasLivePorts() { | 826 DART_EXPORT bool Dart_HasLivePorts() { |
840 Isolate* isolate = Isolate::Current(); | 827 Isolate* isolate = Isolate::Current(); |
841 ASSERT(isolate); | 828 ASSERT(isolate); |
842 return isolate->message_handler()->HasLivePorts(); | 829 return isolate->message_handler()->HasLivePorts(); |
843 } | 830 } |
844 | 831 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 } | 876 } |
890 | 877 |
891 | 878 |
892 DART_EXPORT Dart_Port Dart_NewNativePort(const char* name, | 879 DART_EXPORT Dart_Port Dart_NewNativePort(const char* name, |
893 Dart_NativeMessageHandler handler, | 880 Dart_NativeMessageHandler handler, |
894 bool handle_concurrently) { | 881 bool handle_concurrently) { |
895 if (name == NULL) { | 882 if (name == NULL) { |
896 name = "<UnnamedNativePort>"; | 883 name = "<UnnamedNativePort>"; |
897 } | 884 } |
898 if (handler == NULL) { | 885 if (handler == NULL) { |
899 OS::PrintErr("%s expects argument 'handler' to be non-null.", CURRENT_FUNC); | 886 OS::PrintErr("%s expects argument 'handler' to be non-null.\n", |
| 887 CURRENT_FUNC); |
900 return kIllegalPort; | 888 return kIllegalPort; |
901 } | 889 } |
902 // Start the native port without a current isolate. | 890 // Start the native port without a current isolate. |
903 IsolateSaver saver(Isolate::Current()); | 891 IsolateSaver saver(Isolate::Current()); |
904 Isolate::SetCurrent(NULL); | 892 Isolate::SetCurrent(NULL); |
905 | 893 |
906 NativeMessageHandler* nmh = new NativeMessageHandler(name, handler); | 894 NativeMessageHandler* nmh = new NativeMessageHandler(name, handler); |
907 Dart_Port port_id = PortMap::CreatePort(nmh); | 895 Dart_Port port_id = PortMap::CreatePort(nmh); |
908 nmh->StartWorker(); | 896 nmh->Run(Dart::thread_pool(), NULL, NULL, NULL); |
909 return port_id; | 897 return port_id; |
910 } | 898 } |
911 | 899 |
912 | 900 |
913 DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id) { | 901 DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id) { |
914 // Close the native port without a current isolate. | 902 // Close the native port without a current isolate. |
915 IsolateSaver saver(Isolate::Current()); | 903 IsolateSaver saver(Isolate::Current()); |
916 Isolate::SetCurrent(NULL); | 904 Isolate::SetCurrent(NULL); |
917 | 905 |
918 // TODO(turnidge): Check that the port is native before trying to close. | 906 // TODO(turnidge): Check that the port is native before trying to close. |
(...skipping 2523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3442 *buffer = NULL; | 3430 *buffer = NULL; |
3443 } | 3431 } |
3444 delete debug_region; | 3432 delete debug_region; |
3445 } else { | 3433 } else { |
3446 *buffer = NULL; | 3434 *buffer = NULL; |
3447 *buffer_size = 0; | 3435 *buffer_size = 0; |
3448 } | 3436 } |
3449 } | 3437 } |
3450 | 3438 |
3451 } // namespace dart | 3439 } // namespace dart |
OLD | NEW |