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

Side by Side Diff: mojo/android/system/core_impl.cc

Issue 2056563002: Roll base to 0032c8e1a72eb85d947d8df8de503caa62b4d0a8. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « mojo/android/system/base_run_loop.cc ('k') | services/java_handler/java_handler.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 "mojo/android/system/core_impl.h" 5 #include "mojo/android/system/core_impl.h"
6 6
7 #include "base/android/base_jni_registrar.h" 7 #include "base/android/base_jni_registrar.h"
8 #include "base/android/jni_android.h" 8 #include "base/android/jni_android.h"
9 #include "base/android/jni_registrar.h" 9 #include "base/android/jni_registrar.h"
10 #include "base/android/library_loader/library_loader_hooks.h" 10 #include "base/android/library_loader/library_loader_hooks.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 result, 48 result,
49 callback_data->callback.obj(), 49 callback_data->callback.obj(),
50 callback_data->cancellable.obj()); 50 callback_data->cancellable.obj());
51 } 51 }
52 52
53 } // namespace 53 } // namespace
54 54
55 namespace mojo { 55 namespace mojo {
56 namespace android { 56 namespace android {
57 57
58 static jlong GetTimeTicksNow(JNIEnv* env, jobject jcaller) { 58 static jlong GetTimeTicksNow(JNIEnv* env,
59 const JavaParamRef<jobject>& jcaller) {
59 return MojoGetTimeTicksNow(); 60 return MojoGetTimeTicksNow();
60 } 61 }
61 62
62 static jint WaitMany(JNIEnv* env, 63 static jint WaitMany(JNIEnv* env,
63 jobject jcaller, 64 const JavaParamRef<jobject>& jcaller,
64 jobject buffer, 65 const JavaParamRef<jobject>& buffer,
65 jlong deadline) { 66 jlong deadline) {
66 // |buffer| contains, in this order 67 // |buffer| contains, in this order
67 // input: The array of N handles (MojoHandle, 4 bytes each) 68 // input: The array of N handles (MojoHandle, 4 bytes each)
68 // input: The array of N signals (MojoHandleSignals, 4 bytes each) 69 // input: The array of N signals (MojoHandleSignals, 4 bytes each)
69 // space for output: The array of N handle states (MojoHandleSignalsState, 8 70 // space for output: The array of N handle states (MojoHandleSignalsState, 8
70 // bytes each) 71 // bytes each)
71 // space for output: The result index (uint32_t, 4 bytes) 72 // space for output: The result index (uint32_t, 4 bytes)
72 uint8_t* buffer_start = 73 uint8_t* buffer_start =
73 static_cast<uint8_t*>(env->GetDirectBufferAddress(buffer)); 74 static_cast<uint8_t*>(env->GetDirectBufferAddress(buffer));
74 DCHECK(buffer_start); 75 DCHECK(buffer_start);
(...skipping 12 matching lines...) Expand all
87 reinterpret_cast<const MojoHandleSignals*>(buffer_start + 4 * nb_handles); 88 reinterpret_cast<const MojoHandleSignals*>(buffer_start + 4 * nb_handles);
88 MojoHandleSignalsState* states_start = 89 MojoHandleSignalsState* states_start =
89 reinterpret_cast<MojoHandleSignalsState*>(buffer_start + 8 * nb_handles); 90 reinterpret_cast<MojoHandleSignalsState*>(buffer_start + 8 * nb_handles);
90 uint32_t* result_index = 91 uint32_t* result_index =
91 reinterpret_cast<uint32_t*>(buffer_start + 16 * nb_handles); 92 reinterpret_cast<uint32_t*>(buffer_start + 16 * nb_handles);
92 *result_index = static_cast<uint32_t>(-1); 93 *result_index = static_cast<uint32_t>(-1);
93 return MojoWaitMany(handle_start, signals_start, nb_handles, deadline, 94 return MojoWaitMany(handle_start, signals_start, nb_handles, deadline,
94 result_index, states_start); 95 result_index, states_start);
95 } 96 }
96 97
97 static ScopedJavaLocalRef<jobject> CreateMessagePipe(JNIEnv* env, 98 static ScopedJavaLocalRef<jobject> CreateMessagePipe(
98 jobject jcaller, 99 JNIEnv* env,
99 jobject options_buffer) { 100 const JavaParamRef<jobject>& jcaller,
101 const JavaParamRef<jobject>& options_buffer) {
100 const MojoCreateMessagePipeOptions* options = NULL; 102 const MojoCreateMessagePipeOptions* options = NULL;
101 if (options_buffer) { 103 if (options_buffer) {
102 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); 104 const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
103 DCHECK(buffer_start); 105 DCHECK(buffer_start);
104 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); 106 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
105 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); 107 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
106 DCHECK_EQ(buffer_size, sizeof(MojoCreateMessagePipeOptions)); 108 DCHECK_EQ(buffer_size, sizeof(MojoCreateMessagePipeOptions));
107 options = static_cast<const MojoCreateMessagePipeOptions*>(buffer_start); 109 options = static_cast<const MojoCreateMessagePipeOptions*>(buffer_start);
108 DCHECK_EQ(options->struct_size, buffer_size); 110 DCHECK_EQ(options->struct_size, buffer_size);
109 } 111 }
110 MojoHandle handle1; 112 MojoHandle handle1;
111 MojoHandle handle2; 113 MojoHandle handle2;
112 MojoResult result = MojoCreateMessagePipe(options, &handle1, &handle2); 114 MojoResult result = MojoCreateMessagePipe(options, &handle1, &handle2);
113 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2); 115 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2);
114 } 116 }
115 117
116 static ScopedJavaLocalRef<jobject> CreateDataPipe(JNIEnv* env, 118 static ScopedJavaLocalRef<jobject> CreateDataPipe(
117 jobject jcaller, 119 JNIEnv* env,
118 jobject options_buffer) { 120 const JavaParamRef<jobject>& jcaller,
121 const JavaParamRef<jobject>& options_buffer) {
119 const MojoCreateDataPipeOptions* options = NULL; 122 const MojoCreateDataPipeOptions* options = NULL;
120 if (options_buffer) { 123 if (options_buffer) {
121 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); 124 const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
122 DCHECK(buffer_start); 125 DCHECK(buffer_start);
123 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); 126 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
124 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); 127 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
125 DCHECK_EQ(buffer_size, sizeof(MojoCreateDataPipeOptions)); 128 DCHECK_EQ(buffer_size, sizeof(MojoCreateDataPipeOptions));
126 options = static_cast<const MojoCreateDataPipeOptions*>(buffer_start); 129 options = static_cast<const MojoCreateDataPipeOptions*>(buffer_start);
127 DCHECK_EQ(options->struct_size, buffer_size); 130 DCHECK_EQ(options->struct_size, buffer_size);
128 } 131 }
129 MojoHandle handle1; 132 MojoHandle handle1;
130 MojoHandle handle2; 133 MojoHandle handle2;
131 MojoResult result = MojoCreateDataPipe(options, &handle1, &handle2); 134 MojoResult result = MojoCreateDataPipe(options, &handle1, &handle2);
132 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2); 135 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2);
133 } 136 }
134 137
135 static ScopedJavaLocalRef<jobject> CreateSharedBuffer(JNIEnv* env, 138 static ScopedJavaLocalRef<jobject> CreateSharedBuffer(
136 jobject jcaller, 139 JNIEnv* env,
137 jobject options_buffer, 140 const JavaParamRef<jobject>& jcaller,
138 jlong num_bytes) { 141 const JavaParamRef<jobject>& options_buffer,
142 jlong num_bytes) {
139 const MojoCreateSharedBufferOptions* options = 0; 143 const MojoCreateSharedBufferOptions* options = 0;
140 if (options_buffer) { 144 if (options_buffer) {
141 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); 145 const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
142 DCHECK(buffer_start); 146 DCHECK(buffer_start);
143 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); 147 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
144 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); 148 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
145 DCHECK_EQ(buffer_size, sizeof(MojoCreateSharedBufferOptions)); 149 DCHECK_EQ(buffer_size, sizeof(MojoCreateSharedBufferOptions));
146 options = static_cast<const MojoCreateSharedBufferOptions*>(buffer_start); 150 options = static_cast<const MojoCreateSharedBufferOptions*>(buffer_start);
147 DCHECK_EQ(options->struct_size, buffer_size); 151 DCHECK_EQ(options->struct_size, buffer_size);
148 } 152 }
149 MojoHandle handle; 153 MojoHandle handle;
150 MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle); 154 MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle);
151 return Java_CoreImpl_newResultAndInteger(env, result, handle); 155 return Java_CoreImpl_newResultAndInteger(env, result, handle);
152 } 156 }
153 157
154 static jint Close(JNIEnv* env, jobject jcaller, jint mojo_handle) { 158 static jint Close(JNIEnv* env,
159 const JavaParamRef<jobject>& jcaller,
160 jint mojo_handle) {
155 return MojoClose(mojo_handle); 161 return MojoClose(mojo_handle);
156 } 162 }
157 163
158 static jint Wait(JNIEnv* env, 164 static jint Wait(JNIEnv* env,
159 jobject jcaller, 165 const JavaParamRef<jobject>& jcaller,
160 jobject buffer, 166 const JavaParamRef<jobject>& buffer,
161 jint mojo_handle, 167 jint mojo_handle,
162 jint signals, 168 jint signals,
163 jlong deadline) { 169 jlong deadline) {
164 // Buffer contains space for the MojoHandleSignalsState 170 // Buffer contains space for the MojoHandleSignalsState
165 void* buffer_start = env->GetDirectBufferAddress(buffer); 171 void* buffer_start = env->GetDirectBufferAddress(buffer);
166 DCHECK(buffer_start); 172 DCHECK(buffer_start);
167 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); 173 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
168 DCHECK_EQ(sizeof(struct MojoHandleSignalsState), 174 DCHECK_EQ(sizeof(struct MojoHandleSignalsState),
169 static_cast<size_t>(env->GetDirectBufferCapacity(buffer))); 175 static_cast<size_t>(env->GetDirectBufferCapacity(buffer)));
170 struct MojoHandleSignalsState* signals_state = 176 struct MojoHandleSignalsState* signals_state =
171 static_cast<struct MojoHandleSignalsState*>(buffer_start); 177 static_cast<struct MojoHandleSignalsState*>(buffer_start);
172 return MojoWait(mojo_handle, signals, deadline, signals_state); 178 return MojoWait(mojo_handle, signals, deadline, signals_state);
173 } 179 }
174 180
175 static jint WriteMessage(JNIEnv* env, 181 static jint WriteMessage(JNIEnv* env,
176 jobject jcaller, 182 const JavaParamRef<jobject>& jcaller,
177 jint mojo_handle, 183 jint mojo_handle,
178 jobject bytes, 184 const JavaParamRef<jobject>& bytes,
179 jint num_bytes, 185 jint num_bytes,
180 jobject handles_buffer, 186 const JavaParamRef<jobject>& handles_buffer,
181 jint flags) { 187 jint flags) {
182 const void* buffer_start = 0; 188 const void* buffer_start = 0;
183 uint32_t buffer_size = 0; 189 uint32_t buffer_size = 0;
184 if (bytes) { 190 if (bytes) {
185 buffer_start = env->GetDirectBufferAddress(bytes); 191 buffer_start = env->GetDirectBufferAddress(bytes);
186 DCHECK(buffer_start); 192 DCHECK(buffer_start);
187 DCHECK(env->GetDirectBufferCapacity(bytes) >= num_bytes); 193 DCHECK(env->GetDirectBufferCapacity(bytes) >= num_bytes);
188 buffer_size = num_bytes; 194 buffer_size = num_bytes;
189 } 195 }
190 const MojoHandle* handles = 0; 196 const MojoHandle* handles = 0;
191 uint32_t num_handles = 0; 197 uint32_t num_handles = 0;
192 if (handles_buffer) { 198 if (handles_buffer) {
193 handles = 199 handles =
194 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); 200 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer));
195 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; 201 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4;
196 } 202 }
197 // Java code will handle invalidating handles if the write succeeded. 203 // Java code will handle invalidating handles if the write succeeded.
198 return MojoWriteMessage( 204 return MojoWriteMessage(
199 mojo_handle, buffer_start, buffer_size, handles, num_handles, flags); 205 mojo_handle, buffer_start, buffer_size, handles, num_handles, flags);
200 } 206 }
201 207
202 static ScopedJavaLocalRef<jobject> ReadMessage(JNIEnv* env, 208 static ScopedJavaLocalRef<jobject> ReadMessage(
203 jobject jcaller, 209 JNIEnv* env,
204 jint mojo_handle, 210 const JavaParamRef<jobject>& jcaller,
205 jobject bytes, 211 jint mojo_handle,
206 jobject handles_buffer, 212 const JavaParamRef<jobject>& bytes,
207 jint flags) { 213 const JavaParamRef<jobject>& handles_buffer,
214 jint flags) {
208 void* buffer_start = 0; 215 void* buffer_start = 0;
209 uint32_t buffer_size = 0; 216 uint32_t buffer_size = 0;
210 if (bytes) { 217 if (bytes) {
211 buffer_start = env->GetDirectBufferAddress(bytes); 218 buffer_start = env->GetDirectBufferAddress(bytes);
212 DCHECK(buffer_start); 219 DCHECK(buffer_start);
213 buffer_size = env->GetDirectBufferCapacity(bytes); 220 buffer_size = env->GetDirectBufferCapacity(bytes);
214 } 221 }
215 MojoHandle* handles = 0; 222 MojoHandle* handles = 0;
216 uint32_t num_handles = 0; 223 uint32_t num_handles = 0;
217 if (handles_buffer) { 224 if (handles_buffer) {
218 handles = 225 handles =
219 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); 226 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer));
220 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; 227 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4;
221 } 228 }
222 MojoResult result = MojoReadMessage( 229 MojoResult result = MojoReadMessage(
223 mojo_handle, buffer_start, &buffer_size, handles, &num_handles, flags); 230 mojo_handle, buffer_start, &buffer_size, handles, &num_handles, flags);
224 // Jave code will handle taking ownership of any received handle. 231 // Jave code will handle taking ownership of any received handle.
225 return Java_CoreImpl_newReadMessageResult(env, result, buffer_size, 232 return Java_CoreImpl_newReadMessageResult(env, result, buffer_size,
226 num_handles); 233 num_handles);
227 } 234 }
228 235
229 static ScopedJavaLocalRef<jobject> ReadData(JNIEnv* env, 236 static ScopedJavaLocalRef<jobject> ReadData(
230 jobject jcaller, 237 JNIEnv* env,
231 jint mojo_handle, 238 const JavaParamRef<jobject>& jcaller,
232 jobject elements, 239 jint mojo_handle,
233 jint elements_capacity, 240 const JavaParamRef<jobject>& elements,
234 jint flags) { 241 jint elements_capacity,
242 jint flags) {
235 void* buffer_start = 0; 243 void* buffer_start = 0;
236 uint32_t buffer_size = elements_capacity; 244 uint32_t buffer_size = elements_capacity;
237 if (elements) { 245 if (elements) {
238 buffer_start = env->GetDirectBufferAddress(elements); 246 buffer_start = env->GetDirectBufferAddress(elements);
239 DCHECK(buffer_start); 247 DCHECK(buffer_start);
240 DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements)); 248 DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements));
241 } 249 }
242 MojoResult result = 250 MojoResult result =
243 MojoReadData(mojo_handle, buffer_start, &buffer_size, flags); 251 MojoReadData(mojo_handle, buffer_start, &buffer_size, flags);
244 return Java_CoreImpl_newResultAndInteger( 252 return Java_CoreImpl_newResultAndInteger(
245 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0); 253 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
246 } 254 }
247 255
248 static ScopedJavaLocalRef<jobject> BeginReadData(JNIEnv* env, 256 static ScopedJavaLocalRef<jobject> BeginReadData(
249 jobject jcaller, 257 JNIEnv* env,
250 jint mojo_handle, 258 const JavaParamRef<jobject>& jcaller,
251 jint num_bytes, 259 jint mojo_handle,
252 jint flags) { 260 jint num_bytes,
261 jint flags) {
253 void const* buffer = 0; 262 void const* buffer = 0;
254 uint32_t buffer_size = num_bytes; 263 uint32_t buffer_size = num_bytes;
255 MojoResult result = 264 MojoResult result =
256 MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags); 265 MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags);
257 jobject byte_buffer = 0; 266 jobject byte_buffer = 0;
258 if (result == MOJO_RESULT_OK) { 267 if (result == MOJO_RESULT_OK) {
259 byte_buffer = 268 byte_buffer =
260 env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size); 269 env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size);
261 } 270 }
262 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer); 271 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
263 } 272 }
264 273
265 static jint EndReadData(JNIEnv* env, 274 static jint EndReadData(JNIEnv* env,
266 jobject jcaller, 275 const JavaParamRef<jobject>& jcaller,
267 jint mojo_handle, 276 jint mojo_handle,
268 jint num_bytes_read) { 277 jint num_bytes_read) {
269 return MojoEndReadData(mojo_handle, num_bytes_read); 278 return MojoEndReadData(mojo_handle, num_bytes_read);
270 } 279 }
271 280
272 static ScopedJavaLocalRef<jobject> WriteData(JNIEnv* env, 281 static ScopedJavaLocalRef<jobject> WriteData(
273 jobject jcaller, 282 JNIEnv* env,
274 jint mojo_handle, 283 const JavaParamRef<jobject>& jcaller,
275 jobject elements, 284 jint mojo_handle,
276 jint limit, 285 const JavaParamRef<jobject>& elements,
277 jint flags) { 286 jint limit,
287 jint flags) {
278 void* buffer_start = env->GetDirectBufferAddress(elements); 288 void* buffer_start = env->GetDirectBufferAddress(elements);
279 DCHECK(buffer_start); 289 DCHECK(buffer_start);
280 DCHECK(limit <= env->GetDirectBufferCapacity(elements)); 290 DCHECK(limit <= env->GetDirectBufferCapacity(elements));
281 uint32_t buffer_size = limit; 291 uint32_t buffer_size = limit;
282 MojoResult result = 292 MojoResult result =
283 MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags); 293 MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags);
284 return Java_CoreImpl_newResultAndInteger( 294 return Java_CoreImpl_newResultAndInteger(
285 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0); 295 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
286 } 296 }
287 297
288 static ScopedJavaLocalRef<jobject> BeginWriteData(JNIEnv* env, 298 static ScopedJavaLocalRef<jobject> BeginWriteData(
289 jobject jcaller, 299 JNIEnv* env,
290 jint mojo_handle, 300 const JavaParamRef<jobject>& jcaller,
291 jint num_bytes, 301 jint mojo_handle,
292 jint flags) { 302 jint num_bytes,
303 jint flags) {
293 void* buffer = 0; 304 void* buffer = 0;
294 uint32_t buffer_size = num_bytes; 305 uint32_t buffer_size = num_bytes;
295 MojoResult result = 306 MojoResult result =
296 MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags); 307 MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags);
297 jobject byte_buffer = 0; 308 jobject byte_buffer = 0;
298 if (result == MOJO_RESULT_OK) { 309 if (result == MOJO_RESULT_OK) {
299 byte_buffer = env->NewDirectByteBuffer(buffer, buffer_size); 310 byte_buffer = env->NewDirectByteBuffer(buffer, buffer_size);
300 } 311 }
301 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer); 312 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
302 } 313 }
303 314
304 static jint EndWriteData(JNIEnv* env, 315 static jint EndWriteData(JNIEnv* env,
305 jobject jcaller, 316 const JavaParamRef<jobject>& jcaller,
306 jint mojo_handle, 317 jint mojo_handle,
307 jint num_bytes_written) { 318 jint num_bytes_written) {
308 return MojoEndWriteData(mojo_handle, num_bytes_written); 319 return MojoEndWriteData(mojo_handle, num_bytes_written);
309 } 320 }
310 321
311 static ScopedJavaLocalRef<jobject> Duplicate(JNIEnv* env, 322 static ScopedJavaLocalRef<jobject> Duplicate(
312 jobject jcaller, 323 JNIEnv* env,
313 jint mojo_handle, 324 const JavaParamRef<jobject>& jcaller,
314 jobject options_buffer) { 325 jint mojo_handle,
326 const JavaParamRef<jobject>& options_buffer) {
315 const MojoDuplicateBufferHandleOptions* options = 0; 327 const MojoDuplicateBufferHandleOptions* options = 0;
316 if (options_buffer) { 328 if (options_buffer) {
317 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); 329 const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
318 DCHECK(buffer_start); 330 DCHECK(buffer_start);
319 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); 331 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
320 DCHECK_EQ(buffer_size, sizeof(MojoDuplicateBufferHandleOptions)); 332 DCHECK_EQ(buffer_size, sizeof(MojoDuplicateBufferHandleOptions));
321 options = 333 options =
322 static_cast<const MojoDuplicateBufferHandleOptions*>(buffer_start); 334 static_cast<const MojoDuplicateBufferHandleOptions*>(buffer_start);
323 DCHECK_EQ(options->struct_size, buffer_size); 335 DCHECK_EQ(options->struct_size, buffer_size);
324 } 336 }
325 MojoHandle handle; 337 MojoHandle handle;
326 MojoResult result = MojoDuplicateBufferHandle(mojo_handle, options, &handle); 338 MojoResult result = MojoDuplicateBufferHandle(mojo_handle, options, &handle);
327 return Java_CoreImpl_newResultAndInteger(env, result, handle); 339 return Java_CoreImpl_newResultAndInteger(env, result, handle);
328 } 340 }
329 341
330 static ScopedJavaLocalRef<jobject> Map(JNIEnv* env, 342 static ScopedJavaLocalRef<jobject> Map(JNIEnv* env,
331 jobject jcaller, 343 const JavaParamRef<jobject>& jcaller,
332 jint mojo_handle, 344 jint mojo_handle,
333 jlong offset, 345 jlong offset,
334 jlong num_bytes, 346 jlong num_bytes,
335 jint flags) { 347 jint flags) {
336 void* buffer = 0; 348 void* buffer = 0;
337 MojoResult result = 349 MojoResult result =
338 MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags); 350 MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags);
339 jobject byte_buffer = 0; 351 jobject byte_buffer = 0;
340 if (result == MOJO_RESULT_OK) { 352 if (result == MOJO_RESULT_OK) {
341 byte_buffer = env->NewDirectByteBuffer(buffer, num_bytes); 353 byte_buffer = env->NewDirectByteBuffer(buffer, num_bytes);
342 } 354 }
343 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer); 355 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
344 } 356 }
345 357
346 static int Unmap(JNIEnv* env, jobject jcaller, jobject buffer) { 358 static int Unmap(JNIEnv* env,
359 const JavaParamRef<jobject>& jcaller,
360 const JavaParamRef<jobject>& buffer) {
347 void* buffer_start = env->GetDirectBufferAddress(buffer); 361 void* buffer_start = env->GetDirectBufferAddress(buffer);
348 DCHECK(buffer_start); 362 DCHECK(buffer_start);
349 return MojoUnmapBuffer(buffer_start); 363 return MojoUnmapBuffer(buffer_start);
350 } 364 }
351 365
352 static ScopedJavaLocalRef<jobject> AsyncWait(JNIEnv* env, 366 static ScopedJavaLocalRef<jobject> AsyncWait(
353 jobject jcaller, 367 JNIEnv* env,
354 jint mojo_handle, 368 const JavaParamRef<jobject>& jcaller,
355 jint signals, 369 jint mojo_handle,
356 jlong deadline, 370 jint signals,
357 jobject callback) { 371 jlong deadline,
372 const JavaParamRef<jobject>& callback) {
358 AsyncWaitCallbackData* callback_data = 373 AsyncWaitCallbackData* callback_data =
359 new AsyncWaitCallbackData(env, jcaller, callback); 374 new AsyncWaitCallbackData(env, jcaller, callback);
360 MojoAsyncWaitID cancel_id; 375 MojoAsyncWaitID cancel_id;
361 if (static_cast<MojoHandle>(mojo_handle) != MOJO_HANDLE_INVALID) { 376 if (static_cast<MojoHandle>(mojo_handle) != MOJO_HANDLE_INVALID) {
362 cancel_id = Environment::GetDefaultAsyncWaiter()->AsyncWait( 377 cancel_id = Environment::GetDefaultAsyncWaiter()->AsyncWait(
363 mojo_handle, signals, deadline, AsyncWaitCallback, callback_data); 378 mojo_handle, signals, deadline, AsyncWaitCallback, callback_data);
364 } else { 379 } else {
365 cancel_id = kInvalidHandleCancelID; 380 cancel_id = kInvalidHandleCancelID;
366 base::MessageLoop::current()->PostTask( 381 base::MessageLoop::current()->PostTask(
367 FROM_HERE, 382 FROM_HERE,
368 base::Bind( 383 base::Bind(
369 &AsyncWaitCallback, callback_data, MOJO_RESULT_INVALID_ARGUMENT)); 384 &AsyncWaitCallback, callback_data, MOJO_RESULT_INVALID_ARGUMENT));
370 } 385 }
371 base::android::ScopedJavaLocalRef<jobject> cancellable = 386 base::android::ScopedJavaLocalRef<jobject> cancellable =
372 Java_CoreImpl_newAsyncWaiterCancellableImpl( 387 Java_CoreImpl_newAsyncWaiterCancellableImpl(
373 env, jcaller, cancel_id, reinterpret_cast<intptr_t>(callback_data)); 388 env, jcaller, cancel_id, reinterpret_cast<intptr_t>(callback_data));
374 callback_data->cancellable.Reset(env, cancellable.obj()); 389 callback_data->cancellable.Reset(env, cancellable.obj());
375 return cancellable; 390 return cancellable;
376 } 391 }
377 392
378 static void CancelAsyncWait(JNIEnv* env, 393 static void CancelAsyncWait(JNIEnv* env,
379 jobject jcaller, 394 const JavaParamRef<jobject>& jcaller,
380 jlong id, 395 jlong id,
381 jlong data_ptr) { 396 jlong data_ptr) {
382 if (id == 0) { 397 if (id == 0) {
383 // If |id| is |kInvalidHandleCancelID|, the async wait was done on an 398 // If |id| is |kInvalidHandleCancelID|, the async wait was done on an
384 // invalid handle, so the AsyncWaitCallback will be called and will clear 399 // invalid handle, so the AsyncWaitCallback will be called and will clear
385 // the data_ptr. 400 // the data_ptr.
386 return; 401 return;
387 } 402 }
388 scoped_ptr<AsyncWaitCallbackData> deleter( 403 scoped_ptr<AsyncWaitCallbackData> deleter(
389 reinterpret_cast<AsyncWaitCallbackData*>(data_ptr)); 404 reinterpret_cast<AsyncWaitCallbackData*>(data_ptr));
390 Environment::GetDefaultAsyncWaiter()->CancelWait(id); 405 Environment::GetDefaultAsyncWaiter()->CancelWait(id);
391 } 406 }
392 407
393 static jint GetNativeBufferOffset(JNIEnv* env, 408 static jint GetNativeBufferOffset(JNIEnv* env,
394 jobject jcaller, 409 const JavaParamRef<jobject>& jcaller,
395 jobject buffer, 410 const JavaParamRef<jobject>& buffer,
396 jint alignment) { 411 jint alignment) {
397 jint offset = 412 jint offset =
398 reinterpret_cast<uintptr_t>(env->GetDirectBufferAddress(buffer)) % 413 reinterpret_cast<uintptr_t>(env->GetDirectBufferAddress(buffer)) %
399 alignment; 414 alignment;
400 if (offset == 0) 415 if (offset == 0)
401 return 0; 416 return 0;
402 return alignment - offset; 417 return alignment - offset;
403 } 418 }
404 419
405 static ScopedJavaLocalRef<jobject> GetBufferInformation(JNIEnv* env, 420 static ScopedJavaLocalRef<jobject> GetBufferInformation(
406 jobject jcaller, 421 JNIEnv* env,
407 jint mojo_handle) { 422 const JavaParamRef<jobject>& jcaller,
423 jint mojo_handle) {
408 MojoBufferInformation buffer_information; 424 MojoBufferInformation buffer_information;
409 MojoResult result = 425 MojoResult result =
410 MojoGetBufferInformation(static_cast<MojoHandle>(mojo_handle), 426 MojoGetBufferInformation(static_cast<MojoHandle>(mojo_handle),
411 &buffer_information, sizeof(buffer_information)); 427 &buffer_information, sizeof(buffer_information));
412 return Java_CoreImpl_newResultAndBufferInformation( 428 return Java_CoreImpl_newResultAndBufferInformation(
413 env, result, buffer_information.flags, buffer_information.num_bytes); 429 env, result, buffer_information.flags, buffer_information.num_bytes);
414 } 430 }
415 431
416 bool RegisterCoreImpl(JNIEnv* env) { 432 bool RegisterCoreImpl(JNIEnv* env) {
417 return RegisterNativesImpl(env); 433 return RegisterNativesImpl(env);
418 } 434 }
419 435
420 } // namespace android 436 } // namespace android
421 } // namespace mojo 437 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/android/system/base_run_loop.cc ('k') | services/java_handler/java_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698