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" |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 } | 716 } |
717 | 717 |
718 Dart_Handle list = Dart_NewList(3); | 718 Dart_Handle list = Dart_NewList(3); |
719 Dart_ListSetAt(list, 0, Dart_NewInteger(res)); | 719 Dart_ListSetAt(list, 0, Dart_NewInteger(res)); |
720 Dart_ListSetAt(list, 1, Dart_NewInteger(blen)); | 720 Dart_ListSetAt(list, 1, Dart_NewInteger(blen)); |
721 Dart_ListSetAt(list, 2, Dart_NewInteger(hlen)); | 721 Dart_ListSetAt(list, 2, Dart_NewInteger(hlen)); |
722 Dart_SetReturnValue(arguments, list); | 722 Dart_SetReturnValue(arguments, list); |
723 } | 723 } |
724 | 724 |
725 struct MojoWaitManyState { | 725 struct MojoWaitManyState { |
| 726 MojoWaitManyState() {} |
| 727 |
726 std::vector<uint32_t> handles; | 728 std::vector<uint32_t> handles; |
727 std::vector<uint32_t> signals; | 729 std::vector<uint32_t> signals; |
728 std::vector<uint32_t> out_index; | 730 std::vector<uint32_t> out_index; |
729 std::vector<MojoHandleSignalsState> out_signals; | 731 std::vector<MojoHandleSignalsState> out_signals; |
| 732 |
| 733 static MojoWaitManyState* GetInstance(); |
| 734 |
| 735 private: |
| 736 DISALLOW_COPY_AND_ASSIGN(MojoWaitManyState); |
730 }; | 737 }; |
731 | 738 |
732 // This global is safe because it is only accessed by the single handle watcher | 739 // 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 | 740 // isolate. If multiple handle watcher isolates are ever needed, it will need |
734 // to be replicated. | 741 // to be replicated. |
735 static MojoWaitManyState handle_watcher_wait_state; | 742 MojoWaitManyState* MojoWaitManyState::GetInstance() { |
| 743 static MojoWaitManyState* state = new MojoWaitManyState; |
| 744 return state; |
| 745 } |
736 | 746 |
737 void MojoHandleWatcher_GrowStateArrays(Dart_NativeArguments arguments) { | 747 void MojoHandleWatcher_GrowStateArrays(Dart_NativeArguments arguments) { |
738 int64_t new_length; | 748 int64_t new_length; |
739 CHECK_INTEGER_ARGUMENT(arguments, 0, &new_length, InvalidArgument); | 749 CHECK_INTEGER_ARGUMENT(arguments, 0, &new_length, InvalidArgument); |
740 | 750 |
| 751 MojoWaitManyState& handle_watcher_wait_state = |
| 752 *MojoWaitManyState::GetInstance(); |
| 753 |
741 handle_watcher_wait_state.handles.resize(new_length); | 754 handle_watcher_wait_state.handles.resize(new_length); |
742 handle_watcher_wait_state.signals.resize(new_length); | 755 handle_watcher_wait_state.signals.resize(new_length); |
743 handle_watcher_wait_state.out_index.resize(1); | 756 handle_watcher_wait_state.out_index.resize(1); |
744 handle_watcher_wait_state.out_signals.resize(new_length); | 757 handle_watcher_wait_state.out_signals.resize(new_length); |
745 | 758 |
746 Dart_Handle dart_handles = Dart_NewExternalTypedData( | 759 Dart_Handle dart_handles = Dart_NewExternalTypedData( |
747 Dart_TypedData_kUint32, handle_watcher_wait_state.handles.data(), | 760 Dart_TypedData_kUint32, handle_watcher_wait_state.handles.data(), |
748 handle_watcher_wait_state.handles.size()); | 761 handle_watcher_wait_state.handles.size()); |
749 if (Dart_IsError(dart_handles)) { | 762 if (Dart_IsError(dart_handles)) { |
750 Dart_PropagateError(dart_handles); | 763 Dart_PropagateError(dart_handles); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 Dart_ListSetAt(list, 3, dart_out_signals); | 807 Dart_ListSetAt(list, 3, dart_out_signals); |
795 Dart_SetReturnValue(arguments, list); | 808 Dart_SetReturnValue(arguments, list); |
796 } | 809 } |
797 | 810 |
798 void MojoHandleWatcher_WaitMany(Dart_NativeArguments arguments) { | 811 void MojoHandleWatcher_WaitMany(Dart_NativeArguments arguments) { |
799 int64_t handles_len = 0; | 812 int64_t handles_len = 0; |
800 int64_t deadline = 0; | 813 int64_t deadline = 0; |
801 CHECK_INTEGER_ARGUMENT(arguments, 0, &handles_len, InvalidArgument); | 814 CHECK_INTEGER_ARGUMENT(arguments, 0, &handles_len, InvalidArgument); |
802 CHECK_INTEGER_ARGUMENT(arguments, 1, &deadline, InvalidArgument); | 815 CHECK_INTEGER_ARGUMENT(arguments, 1, &deadline, InvalidArgument); |
803 | 816 |
| 817 MojoWaitManyState& handle_watcher_wait_state = |
| 818 *MojoWaitManyState::GetInstance(); |
| 819 |
804 uint32_t* handles = handle_watcher_wait_state.handles.data(); | 820 uint32_t* handles = handle_watcher_wait_state.handles.data(); |
805 uint32_t* signals = handle_watcher_wait_state.signals.data(); | 821 uint32_t* signals = handle_watcher_wait_state.signals.data(); |
806 uint32_t* out_index = handle_watcher_wait_state.out_index.data(); | 822 uint32_t* out_index = handle_watcher_wait_state.out_index.data(); |
807 MojoHandleSignalsState* out_signals = | 823 MojoHandleSignalsState* out_signals = |
808 handle_watcher_wait_state.out_signals.data(); | 824 handle_watcher_wait_state.out_signals.data(); |
809 | 825 |
810 Dart_IsolateBlocked(); | 826 Dart_IsolateBlocked(); |
811 MojoResult mojo_result = MojoWaitMany(handles, signals, handles_len, deadline, | 827 MojoResult mojo_result = MojoWaitMany(handles, signals, handles_len, deadline, |
812 out_index, out_signals); | 828 out_index, out_signals); |
813 Dart_IsolateUnblocked(); | 829 Dart_IsolateUnblocked(); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 mojo_control_handle = control_handle; | 897 mojo_control_handle = control_handle; |
882 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK)); | 898 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK)); |
883 } | 899 } |
884 | 900 |
885 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) { | 901 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) { |
886 Dart_SetIntegerReturnValue(arguments, mojo_control_handle); | 902 Dart_SetIntegerReturnValue(arguments, mojo_control_handle); |
887 } | 903 } |
888 | 904 |
889 } // namespace dart | 905 } // namespace dart |
890 } // namespace mojo | 906 } // namespace mojo |
OLD | NEW |