OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdio.h> | 5 #include <stdio.h> |
6 #include <string.h> | 6 #include <string.h> |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/macros.h" | 11 #include "base/macros.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/memory/singleton.h" | |
13 #include "dart/runtime/include/dart_api.h" | 14 #include "dart/runtime/include/dart_api.h" |
14 #include "mojo/dart/embedder/builtin.h" | 15 #include "mojo/dart/embedder/builtin.h" |
15 #include "mojo/dart/embedder/mojo_dart_state.h" | 16 #include "mojo/dart/embedder/mojo_dart_state.h" |
16 #include "mojo/public/c/system/core.h" | 17 #include "mojo/public/c/system/core.h" |
17 #include "mojo/public/cpp/system/core.h" | 18 #include "mojo/public/cpp/system/core.h" |
18 | 19 |
19 namespace mojo { | 20 namespace mojo { |
20 namespace dart { | 21 namespace dart { |
21 | 22 |
22 #define MOJO_NATIVE_LIST(V) \ | 23 #define MOJO_NATIVE_LIST(V) \ |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
720 Dart_ListSetAt(list, 1, Dart_NewInteger(blen)); | 721 Dart_ListSetAt(list, 1, Dart_NewInteger(blen)); |
721 Dart_ListSetAt(list, 2, Dart_NewInteger(hlen)); | 722 Dart_ListSetAt(list, 2, Dart_NewInteger(hlen)); |
722 Dart_SetReturnValue(arguments, list); | 723 Dart_SetReturnValue(arguments, list); |
723 } | 724 } |
724 | 725 |
725 struct MojoWaitManyState { | 726 struct MojoWaitManyState { |
726 std::vector<uint32_t> handles; | 727 std::vector<uint32_t> handles; |
727 std::vector<uint32_t> signals; | 728 std::vector<uint32_t> signals; |
728 std::vector<uint32_t> out_index; | 729 std::vector<uint32_t> out_index; |
729 std::vector<MojoHandleSignalsState> out_signals; | 730 std::vector<MojoHandleSignalsState> out_signals; |
731 | |
732 static MojoWaitManyState* GetInstance(); | |
730 }; | 733 }; |
731 | 734 |
732 // This global is safe because it is only accessed by the single handle watcher | 735 // This global is safe because it is only accessed by the single handle watcher |
733 // isolate. If multiple handle watcher isolates are ever needed, it will need | 736 // isolate. If multiple handle watcher isolates are ever needed, it will need |
734 // to be replicated. | 737 // to be replicated. |
735 static MojoWaitManyState handle_watcher_wait_state; | 738 MojoWaitManyState* MojoWaitManyState::GetInstance() { |
739 return Singleton<MojoWaitManyState>::get(); | |
jamesr
2015/10/09 23:42:32
Singleton<> here is providing thread-safe initiali
jsimmons1
2015/10/09 23:50:46
Done.
| |
740 } | |
736 | 741 |
737 void MojoHandleWatcher_GrowStateArrays(Dart_NativeArguments arguments) { | 742 void MojoHandleWatcher_GrowStateArrays(Dart_NativeArguments arguments) { |
738 int64_t new_length; | 743 int64_t new_length; |
739 CHECK_INTEGER_ARGUMENT(arguments, 0, &new_length, InvalidArgument); | 744 CHECK_INTEGER_ARGUMENT(arguments, 0, &new_length, InvalidArgument); |
740 | 745 |
741 handle_watcher_wait_state.handles.resize(new_length); | 746 MojoWaitManyState* handle_watcher_wait_state = |
jamesr
2015/10/09 23:42:32
Make this a reference and you won't have to change
abarth-chromium
2015/10/09 23:45:46
If you make this a reference, please add DISALLOW_
jsimmons1
2015/10/09 23:50:46
Done.
| |
742 handle_watcher_wait_state.signals.resize(new_length); | 747 MojoWaitManyState::GetInstance(); |
743 handle_watcher_wait_state.out_index.resize(1); | 748 |
744 handle_watcher_wait_state.out_signals.resize(new_length); | 749 handle_watcher_wait_state->handles.resize(new_length); |
750 handle_watcher_wait_state->signals.resize(new_length); | |
751 handle_watcher_wait_state->out_index.resize(1); | |
752 handle_watcher_wait_state->out_signals.resize(new_length); | |
745 | 753 |
746 Dart_Handle dart_handles = Dart_NewExternalTypedData( | 754 Dart_Handle dart_handles = Dart_NewExternalTypedData( |
747 Dart_TypedData_kUint32, handle_watcher_wait_state.handles.data(), | 755 Dart_TypedData_kUint32, handle_watcher_wait_state->handles.data(), |
748 handle_watcher_wait_state.handles.size()); | 756 handle_watcher_wait_state->handles.size()); |
749 if (Dart_IsError(dart_handles)) { | 757 if (Dart_IsError(dart_handles)) { |
750 Dart_PropagateError(dart_handles); | 758 Dart_PropagateError(dart_handles); |
751 } | 759 } |
752 if (Dart_IsNull(dart_handles)) { | 760 if (Dart_IsNull(dart_handles)) { |
753 SetNullReturn(arguments); | 761 SetNullReturn(arguments); |
754 return; | 762 return; |
755 } | 763 } |
756 | 764 |
757 Dart_Handle dart_signals = Dart_NewExternalTypedData( | 765 Dart_Handle dart_signals = Dart_NewExternalTypedData( |
758 Dart_TypedData_kUint32, handle_watcher_wait_state.signals.data(), | 766 Dart_TypedData_kUint32, handle_watcher_wait_state->signals.data(), |
759 handle_watcher_wait_state.signals.size()); | 767 handle_watcher_wait_state->signals.size()); |
760 if (Dart_IsError(dart_signals)) { | 768 if (Dart_IsError(dart_signals)) { |
761 Dart_PropagateError(dart_signals); | 769 Dart_PropagateError(dart_signals); |
762 } | 770 } |
763 if (Dart_IsNull(dart_signals)) { | 771 if (Dart_IsNull(dart_signals)) { |
764 SetNullReturn(arguments); | 772 SetNullReturn(arguments); |
765 return; | 773 return; |
766 } | 774 } |
767 | 775 |
768 Dart_Handle dart_out_index = Dart_NewExternalTypedData( | 776 Dart_Handle dart_out_index = Dart_NewExternalTypedData( |
769 Dart_TypedData_kUint32, handle_watcher_wait_state.out_index.data(), | 777 Dart_TypedData_kUint32, handle_watcher_wait_state->out_index.data(), |
770 handle_watcher_wait_state.out_index.size()); | 778 handle_watcher_wait_state->out_index.size()); |
771 if (Dart_IsError(dart_out_index)) { | 779 if (Dart_IsError(dart_out_index)) { |
772 Dart_PropagateError(dart_out_index); | 780 Dart_PropagateError(dart_out_index); |
773 } | 781 } |
774 if (Dart_IsNull(dart_out_index)) { | 782 if (Dart_IsNull(dart_out_index)) { |
775 SetNullReturn(arguments); | 783 SetNullReturn(arguments); |
776 return; | 784 return; |
777 } | 785 } |
778 | 786 |
779 Dart_Handle dart_out_signals = Dart_NewExternalTypedData( | 787 Dart_Handle dart_out_signals = Dart_NewExternalTypedData( |
780 Dart_TypedData_kUint64, handle_watcher_wait_state.out_signals.data(), | 788 Dart_TypedData_kUint64, handle_watcher_wait_state->out_signals.data(), |
781 handle_watcher_wait_state.out_signals.size()); | 789 handle_watcher_wait_state->out_signals.size()); |
782 if (Dart_IsError(dart_out_signals)) { | 790 if (Dart_IsError(dart_out_signals)) { |
783 Dart_PropagateError(dart_out_signals); | 791 Dart_PropagateError(dart_out_signals); |
784 } | 792 } |
785 if (Dart_IsNull(dart_out_signals)) { | 793 if (Dart_IsNull(dart_out_signals)) { |
786 SetNullReturn(arguments); | 794 SetNullReturn(arguments); |
787 return; | 795 return; |
788 } | 796 } |
789 | 797 |
790 Dart_Handle list = Dart_NewList(4); | 798 Dart_Handle list = Dart_NewList(4); |
791 Dart_ListSetAt(list, 0, dart_handles); | 799 Dart_ListSetAt(list, 0, dart_handles); |
792 Dart_ListSetAt(list, 1, dart_signals); | 800 Dart_ListSetAt(list, 1, dart_signals); |
793 Dart_ListSetAt(list, 2, dart_out_index); | 801 Dart_ListSetAt(list, 2, dart_out_index); |
794 Dart_ListSetAt(list, 3, dart_out_signals); | 802 Dart_ListSetAt(list, 3, dart_out_signals); |
795 Dart_SetReturnValue(arguments, list); | 803 Dart_SetReturnValue(arguments, list); |
796 } | 804 } |
797 | 805 |
798 void MojoHandleWatcher_WaitMany(Dart_NativeArguments arguments) { | 806 void MojoHandleWatcher_WaitMany(Dart_NativeArguments arguments) { |
799 int64_t handles_len = 0; | 807 int64_t handles_len = 0; |
800 int64_t deadline = 0; | 808 int64_t deadline = 0; |
801 CHECK_INTEGER_ARGUMENT(arguments, 0, &handles_len, InvalidArgument); | 809 CHECK_INTEGER_ARGUMENT(arguments, 0, &handles_len, InvalidArgument); |
802 CHECK_INTEGER_ARGUMENT(arguments, 1, &deadline, InvalidArgument); | 810 CHECK_INTEGER_ARGUMENT(arguments, 1, &deadline, InvalidArgument); |
803 | 811 |
804 uint32_t* handles = handle_watcher_wait_state.handles.data(); | 812 MojoWaitManyState* handle_watcher_wait_state = |
805 uint32_t* signals = handle_watcher_wait_state.signals.data(); | 813 MojoWaitManyState::GetInstance(); |
806 uint32_t* out_index = handle_watcher_wait_state.out_index.data(); | 814 |
815 uint32_t* handles = handle_watcher_wait_state->handles.data(); | |
816 uint32_t* signals = handle_watcher_wait_state->signals.data(); | |
817 uint32_t* out_index = handle_watcher_wait_state->out_index.data(); | |
807 MojoHandleSignalsState* out_signals = | 818 MojoHandleSignalsState* out_signals = |
808 handle_watcher_wait_state.out_signals.data(); | 819 handle_watcher_wait_state->out_signals.data(); |
809 | 820 |
810 Dart_IsolateBlocked(); | 821 Dart_IsolateBlocked(); |
811 MojoResult mojo_result = MojoWaitMany(handles, signals, handles_len, deadline, | 822 MojoResult mojo_result = MojoWaitMany(handles, signals, handles_len, deadline, |
812 out_index, out_signals); | 823 out_index, out_signals); |
813 Dart_IsolateUnblocked(); | 824 Dart_IsolateUnblocked(); |
814 | 825 |
815 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(mojo_result)); | 826 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(mojo_result)); |
816 } | 827 } |
817 | 828 |
818 struct ControlData { | 829 struct ControlData { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
881 mojo_control_handle = control_handle; | 892 mojo_control_handle = control_handle; |
882 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK)); | 893 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK)); |
883 } | 894 } |
884 | 895 |
885 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) { | 896 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) { |
886 Dart_SetIntegerReturnValue(arguments, mojo_control_handle); | 897 Dart_SetIntegerReturnValue(arguments, mojo_control_handle); |
887 } | 898 } |
888 | 899 |
889 } // namespace dart | 900 } // namespace dart |
890 } // namespace mojo | 901 } // namespace mojo |
OLD | NEW |