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

Side by Side Diff: mojo/dart/embedder/mojo_natives.cc

Issue 1411843005: Dart: Removes C++ set for closing handles on an unhandled exception. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 1 month 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
« no previous file with comments | « mojo/dart/embedder/mojo_dart_state.h ('k') | mojo/dart/embedder/test/dart_to_cpp_tests.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 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 7
8 #include <memory> 8 #include <memory>
9 #include <set>
10 #include <vector> 9 #include <vector>
11 10
12 #include "dart/runtime/include/dart_api.h" 11 #include "dart/runtime/include/dart_api.h"
13 #include "mojo/dart/embedder/builtin.h" 12 #include "mojo/dart/embedder/builtin.h"
14 #include "mojo/dart/embedder/mojo_dart_state.h"
15 #include "mojo/public/c/system/core.h" 13 #include "mojo/public/c/system/core.h"
16 #include "mojo/public/cpp/environment/logging.h" 14 #include "mojo/public/cpp/environment/logging.h"
17 #include "mojo/public/cpp/system/core.h" 15 #include "mojo/public/cpp/system/core.h"
18 #include "mojo/public/cpp/system/macros.h" 16 #include "mojo/public/cpp/system/macros.h"
19 17
20 namespace mojo { 18 namespace mojo {
21 namespace dart { 19 namespace dart {
22 20
23 #define MOJO_NATIVE_LIST(V) \ 21 #define MOJO_NATIVE_LIST(V) \
24 V(MojoSharedBuffer_Create, 2) \ 22 V(MojoSharedBuffer_Create, 2) \
25 V(MojoSharedBuffer_Duplicate, 2) \ 23 V(MojoSharedBuffer_Duplicate, 2) \
26 V(MojoSharedBuffer_Map, 5) \ 24 V(MojoSharedBuffer_Map, 5) \
27 V(MojoSharedBuffer_Unmap, 1) \ 25 V(MojoSharedBuffer_Unmap, 1) \
28 V(MojoDataPipe_Create, 3) \ 26 V(MojoDataPipe_Create, 3) \
29 V(MojoDataPipe_WriteData, 4) \ 27 V(MojoDataPipe_WriteData, 4) \
30 V(MojoDataPipe_BeginWriteData, 3) \ 28 V(MojoDataPipe_BeginWriteData, 3) \
31 V(MojoDataPipe_EndWriteData, 2) \ 29 V(MojoDataPipe_EndWriteData, 2) \
32 V(MojoDataPipe_ReadData, 4) \ 30 V(MojoDataPipe_ReadData, 4) \
33 V(MojoDataPipe_BeginReadData, 3) \ 31 V(MojoDataPipe_BeginReadData, 3) \
34 V(MojoDataPipe_EndReadData, 2) \ 32 V(MojoDataPipe_EndReadData, 2) \
35 V(MojoMessagePipe_Create, 1) \ 33 V(MojoMessagePipe_Create, 1) \
36 V(MojoMessagePipe_Write, 5) \ 34 V(MojoMessagePipe_Write, 5) \
37 V(MojoMessagePipe_Read, 5) \ 35 V(MojoMessagePipe_Read, 5) \
38 V(Mojo_GetTimeTicksNow, 0) \ 36 V(Mojo_GetTimeTicksNow, 0) \
39 V(MojoHandle_Close, 1) \ 37 V(MojoHandle_Close, 1) \
40 V(MojoHandle_Wait, 3) \ 38 V(MojoHandle_Wait, 3) \
41 V(MojoHandle_Register, 2) \ 39 V(MojoHandle_RegisterFinalizer, 2) \
42 V(MojoHandle_WaitMany, 3) \ 40 V(MojoHandle_WaitMany, 3) \
43 V(MojoHandleWatcher_GrowStateArrays, 1) \ 41 V(MojoHandleWatcher_GrowStateArrays, 1) \
44 V(MojoHandleWatcher_WaitMany, 2) \ 42 V(MojoHandleWatcher_WaitMany, 2) \
45 V(MojoHandleWatcher_SendControlData, 4) \ 43 V(MojoHandleWatcher_SendControlData, 4) \
46 V(MojoHandleWatcher_RecvControlData, 1) \ 44 V(MojoHandleWatcher_RecvControlData, 1) \
47 V(MojoHandleWatcher_SetControlHandle, 1) \ 45 V(MojoHandleWatcher_SetControlHandle, 1) \
48 V(MojoHandleWatcher_GetControlHandle, 0) 46 V(MojoHandleWatcher_GetControlHandle, 0)
49 47
50 MOJO_NATIVE_LIST(DECLARE_FUNCTION); 48 MOJO_NATIVE_LIST(DECLARE_FUNCTION);
51 49
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 // the handle has leaked from the Dart code, which is an error. 128 // the handle has leaked from the Dart code, which is an error.
131 MOJO_LOG(ERROR) << "Handle Finalizer closing handle:\n\tisolate: " 129 MOJO_LOG(ERROR) << "Handle Finalizer closing handle:\n\tisolate: "
132 << "\n\thandle: " << callback_peer->handle; 130 << "\n\thandle: " << callback_peer->handle;
133 } 131 }
134 } 132 }
135 delete callback_peer; 133 delete callback_peer;
136 } 134 }
137 135
138 // Setup a weak persistent handle for a MojoHandle that calls MojoClose on the 136 // Setup a weak persistent handle for a MojoHandle that calls MojoClose on the
139 // handle when the MojoHandle is GC'd or the VM is going down. 137 // handle when the MojoHandle is GC'd or the VM is going down.
140 void MojoHandle_Register(Dart_NativeArguments arguments) { 138 void MojoHandle_RegisterFinalizer(Dart_NativeArguments arguments) {
141 Dart_Handle mojo_handle_instance = Dart_GetNativeArgument(arguments, 0); 139 Dart_Handle mojo_handle_instance = Dart_GetNativeArgument(arguments, 0);
142 if (!Dart_IsInstance(mojo_handle_instance)) { 140 if (!Dart_IsInstance(mojo_handle_instance)) {
143 SetInvalidArgumentReturn(arguments); 141 SetInvalidArgumentReturn(arguments);
144 return; 142 return;
145 } 143 }
146 144
147 int64_t raw_handle = static_cast<int64_t>(MOJO_HANDLE_INVALID); 145 int64_t raw_handle = static_cast<int64_t>(MOJO_HANDLE_INVALID);
148 CHECK_INTEGER_ARGUMENT(arguments, 1, &raw_handle, InvalidArgument); 146 CHECK_INTEGER_ARGUMENT(arguments, 1, &raw_handle, InvalidArgument);
149 if (raw_handle == static_cast<int64_t>(MOJO_HANDLE_INVALID)) { 147 if (raw_handle == static_cast<int64_t>(MOJO_HANDLE_INVALID)) {
150 SetInvalidArgumentReturn(arguments); 148 SetInvalidArgumentReturn(arguments);
151 return; 149 return;
152 } 150 }
153 151
154 // Add the handle to this isolate's set. 152 // Add the handle to this isolate's set.
155 MojoHandle handle = static_cast<MojoHandle>(raw_handle); 153 MojoHandle handle = static_cast<MojoHandle>(raw_handle);
156 auto isolate_data = MojoDartState::Current();
157 assert(isolate_data != nullptr);
158 isolate_data->unclosed_handles().insert(handle);
159 154
160 // Set up a finalizer. 155 // Set up a finalizer.
161 CloserCallbackPeer* callback_peer = new CloserCallbackPeer(); 156 CloserCallbackPeer* callback_peer = new CloserCallbackPeer();
162 callback_peer->handle = handle; 157 callback_peer->handle = handle;
163 Dart_NewWeakPersistentHandle(mojo_handle_instance, 158 Dart_NewWeakPersistentHandle(mojo_handle_instance,
164 reinterpret_cast<void*>(callback_peer), 159 reinterpret_cast<void*>(callback_peer),
165 sizeof(CloserCallbackPeer), 160 sizeof(CloserCallbackPeer),
166 MojoHandleCloserCallback); 161 MojoHandleCloserCallback);
167 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK)); 162 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK));
168 } 163 }
169 164
170 void Mojo_GetTimeTicksNow(Dart_NativeArguments arguments) { 165 void Mojo_GetTimeTicksNow(Dart_NativeArguments arguments) {
171 MojoTimeTicks ticks = MojoGetTimeTicksNow(); 166 MojoTimeTicks ticks = MojoGetTimeTicksNow();
172 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(ticks)); 167 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(ticks));
173 } 168 }
174 169
175 void MojoHandle_Close(Dart_NativeArguments arguments) { 170 void MojoHandle_Close(Dart_NativeArguments arguments) {
176 int64_t raw_handle; 171 int64_t raw_handle;
177 CHECK_INTEGER_ARGUMENT(arguments, 0, &raw_handle, InvalidArgument); 172 CHECK_INTEGER_ARGUMENT(arguments, 0, &raw_handle, InvalidArgument);
178 173
179 // Remove the handle from this isolate's set. 174 // Remove the handle from this isolate's set.
180 MojoHandle handle = static_cast<MojoHandle>(raw_handle); 175 MojoHandle handle = static_cast<MojoHandle>(raw_handle);
181 auto isolate_data = MojoDartState::Current();
182 assert(isolate_data != nullptr);
183 isolate_data->unclosed_handles().erase(handle);
184
185 MojoResult res = MojoClose(handle); 176 MojoResult res = MojoClose(handle);
186 177
187 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(res)); 178 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(res));
188 } 179 }
189 180
190 void MojoHandle_Wait(Dart_NativeArguments arguments) { 181 void MojoHandle_Wait(Dart_NativeArguments arguments) {
191 int64_t handle = 0; 182 int64_t handle = 0;
192 int64_t signals = 0; 183 int64_t signals = 0;
193 int64_t deadline = 0; 184 int64_t deadline = 0;
194 CHECK_INTEGER_ARGUMENT(arguments, 0, &handle, InvalidArgument); 185 CHECK_INTEGER_ARGUMENT(arguments, 0, &handle, InvalidArgument);
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
727 MojoWaitManyState() {} 718 MojoWaitManyState() {}
728 719
729 std::vector<uint32_t> handles; 720 std::vector<uint32_t> handles;
730 std::vector<uint32_t> signals; 721 std::vector<uint32_t> signals;
731 std::vector<uint32_t> out_index; 722 std::vector<uint32_t> out_index;
732 std::vector<MojoHandleSignalsState> out_signals; 723 std::vector<MojoHandleSignalsState> out_signals;
733 724
734 static MojoWaitManyState* GetInstance(); 725 static MojoWaitManyState* GetInstance();
735 726
736 private: 727 private:
737 DISALLOW_COPY_AND_ASSIGN(MojoWaitManyState); 728 MOJO_DISALLOW_COPY_AND_ASSIGN(MojoWaitManyState);
738 }; 729 };
739 730
740 // This global is safe because it is only accessed by the single handle watcher 731 // This global is safe because it is only accessed by the single handle watcher
741 // isolate. If multiple handle watcher isolates are ever needed, it will need 732 // isolate. If multiple handle watcher isolates are ever needed, it will need
742 // to be replicated. 733 // to be replicated.
743 MojoWaitManyState* MojoWaitManyState::GetInstance() { 734 MojoWaitManyState* MojoWaitManyState::GetInstance() {
744 static MojoWaitManyState* state = new MojoWaitManyState; 735 static MojoWaitManyState* state = new MojoWaitManyState;
745 return state; 736 return state;
746 } 737 }
747 738
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 mojo_control_handle = control_handle; 889 mojo_control_handle = control_handle;
899 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK)); 890 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK));
900 } 891 }
901 892
902 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) { 893 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) {
903 Dart_SetIntegerReturnValue(arguments, mojo_control_handle); 894 Dart_SetIntegerReturnValue(arguments, mojo_control_handle);
904 } 895 }
905 896
906 } // namespace dart 897 } // namespace dart
907 } // namespace mojo 898 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/dart/embedder/mojo_dart_state.h ('k') | mojo/dart/embedder/test/dart_to_cpp_tests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698