| 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 "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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 reinterpret_cast<const MojoHandleSignals*>(buffer_start + 4 * nb_handles); | 87 reinterpret_cast<const MojoHandleSignals*>(buffer_start + 4 * nb_handles); |
| 88 MojoHandleSignalsState* states_start = | 88 MojoHandleSignalsState* states_start = |
| 89 reinterpret_cast<MojoHandleSignalsState*>(buffer_start + 8 * nb_handles); | 89 reinterpret_cast<MojoHandleSignalsState*>(buffer_start + 8 * nb_handles); |
| 90 uint32_t* result_index = | 90 uint32_t* result_index = |
| 91 reinterpret_cast<uint32_t*>(buffer_start + 16 * nb_handles); | 91 reinterpret_cast<uint32_t*>(buffer_start + 16 * nb_handles); |
| 92 *result_index = static_cast<uint32_t>(-1); | 92 *result_index = static_cast<uint32_t>(-1); |
| 93 return MojoWaitMany(handle_start, signals_start, nb_handles, deadline, | 93 return MojoWaitMany(handle_start, signals_start, nb_handles, deadline, |
| 94 result_index, states_start); | 94 result_index, states_start); |
| 95 } | 95 } |
| 96 | 96 |
| 97 static jobject CreateMessagePipe(JNIEnv* env, | 97 static ScopedJavaLocalRef<jobject> CreateMessagePipe(JNIEnv* env, |
| 98 jobject jcaller, | 98 jobject jcaller, |
| 99 jobject options_buffer) { | 99 jobject options_buffer) { |
| 100 const MojoCreateMessagePipeOptions* options = NULL; | 100 const MojoCreateMessagePipeOptions* options = NULL; |
| 101 if (options_buffer) { | 101 if (options_buffer) { |
| 102 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | 102 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); |
| 103 DCHECK(buffer_start); | 103 DCHECK(buffer_start); |
| 104 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); | 104 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); |
| 105 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | 105 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); |
| 106 DCHECK_EQ(buffer_size, sizeof(MojoCreateMessagePipeOptions)); | 106 DCHECK_EQ(buffer_size, sizeof(MojoCreateMessagePipeOptions)); |
| 107 options = static_cast<const MojoCreateMessagePipeOptions*>(buffer_start); | 107 options = static_cast<const MojoCreateMessagePipeOptions*>(buffer_start); |
| 108 DCHECK_EQ(options->struct_size, buffer_size); | 108 DCHECK_EQ(options->struct_size, buffer_size); |
| 109 } | 109 } |
| 110 MojoHandle handle1; | 110 MojoHandle handle1; |
| 111 MojoHandle handle2; | 111 MojoHandle handle2; |
| 112 MojoResult result = MojoCreateMessagePipe(options, &handle1, &handle2); | 112 MojoResult result = MojoCreateMessagePipe(options, &handle1, &handle2); |
| 113 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2) | 113 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2); |
| 114 .Release(); | |
| 115 } | 114 } |
| 116 | 115 |
| 117 static jobject CreateDataPipe(JNIEnv* env, | 116 static ScopedJavaLocalRef<jobject> CreateDataPipe(JNIEnv* env, |
| 118 jobject jcaller, | 117 jobject jcaller, |
| 119 jobject options_buffer) { | 118 jobject options_buffer) { |
| 120 const MojoCreateDataPipeOptions* options = NULL; | 119 const MojoCreateDataPipeOptions* options = NULL; |
| 121 if (options_buffer) { | 120 if (options_buffer) { |
| 122 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | 121 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); |
| 123 DCHECK(buffer_start); | 122 DCHECK(buffer_start); |
| 124 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); | 123 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); |
| 125 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | 124 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); |
| 126 DCHECK_EQ(buffer_size, sizeof(MojoCreateDataPipeOptions)); | 125 DCHECK_EQ(buffer_size, sizeof(MojoCreateDataPipeOptions)); |
| 127 options = static_cast<const MojoCreateDataPipeOptions*>(buffer_start); | 126 options = static_cast<const MojoCreateDataPipeOptions*>(buffer_start); |
| 128 DCHECK_EQ(options->struct_size, buffer_size); | 127 DCHECK_EQ(options->struct_size, buffer_size); |
| 129 } | 128 } |
| 130 MojoHandle handle1; | 129 MojoHandle handle1; |
| 131 MojoHandle handle2; | 130 MojoHandle handle2; |
| 132 MojoResult result = MojoCreateDataPipe(options, &handle1, &handle2); | 131 MojoResult result = MojoCreateDataPipe(options, &handle1, &handle2); |
| 133 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2) | 132 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2); |
| 134 .Release(); | |
| 135 } | 133 } |
| 136 | 134 |
| 137 static jobject CreateSharedBuffer(JNIEnv* env, | 135 static ScopedJavaLocalRef<jobject> CreateSharedBuffer(JNIEnv* env, |
| 138 jobject jcaller, | 136 jobject jcaller, |
| 139 jobject options_buffer, | 137 jobject options_buffer, |
| 140 jlong num_bytes) { | 138 jlong num_bytes) { |
| 141 const MojoCreateSharedBufferOptions* options = 0; | 139 const MojoCreateSharedBufferOptions* options = 0; |
| 142 if (options_buffer) { | 140 if (options_buffer) { |
| 143 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | 141 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); |
| 144 DCHECK(buffer_start); | 142 DCHECK(buffer_start); |
| 145 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); | 143 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); |
| 146 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | 144 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); |
| 147 DCHECK_EQ(buffer_size, sizeof(MojoCreateSharedBufferOptions)); | 145 DCHECK_EQ(buffer_size, sizeof(MojoCreateSharedBufferOptions)); |
| 148 options = static_cast<const MojoCreateSharedBufferOptions*>(buffer_start); | 146 options = static_cast<const MojoCreateSharedBufferOptions*>(buffer_start); |
| 149 DCHECK_EQ(options->struct_size, buffer_size); | 147 DCHECK_EQ(options->struct_size, buffer_size); |
| 150 } | 148 } |
| 151 MojoHandle handle; | 149 MojoHandle handle; |
| 152 MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle); | 150 MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle); |
| 153 return Java_CoreImpl_newResultAndInteger(env, result, handle).Release(); | 151 return Java_CoreImpl_newResultAndInteger(env, result, handle); |
| 154 } | 152 } |
| 155 | 153 |
| 156 static jint Close(JNIEnv* env, jobject jcaller, jint mojo_handle) { | 154 static jint Close(JNIEnv* env, jobject jcaller, jint mojo_handle) { |
| 157 return MojoClose(mojo_handle); | 155 return MojoClose(mojo_handle); |
| 158 } | 156 } |
| 159 | 157 |
| 160 static jint Wait(JNIEnv* env, | 158 static jint Wait(JNIEnv* env, |
| 161 jobject jcaller, | 159 jobject jcaller, |
| 162 jobject buffer, | 160 jobject buffer, |
| 163 jint mojo_handle, | 161 jint mojo_handle, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 194 if (handles_buffer) { | 192 if (handles_buffer) { |
| 195 handles = | 193 handles = |
| 196 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); | 194 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); |
| 197 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; | 195 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; |
| 198 } | 196 } |
| 199 // Java code will handle invalidating handles if the write succeeded. | 197 // Java code will handle invalidating handles if the write succeeded. |
| 200 return MojoWriteMessage( | 198 return MojoWriteMessage( |
| 201 mojo_handle, buffer_start, buffer_size, handles, num_handles, flags); | 199 mojo_handle, buffer_start, buffer_size, handles, num_handles, flags); |
| 202 } | 200 } |
| 203 | 201 |
| 204 static jobject ReadMessage(JNIEnv* env, | 202 static ScopedJavaLocalRef<jobject> ReadMessage(JNIEnv* env, |
| 205 jobject jcaller, | 203 jobject jcaller, |
| 206 jint mojo_handle, | 204 jint mojo_handle, |
| 207 jobject bytes, | 205 jobject bytes, |
| 208 jobject handles_buffer, | 206 jobject handles_buffer, |
| 209 jint flags) { | 207 jint flags) { |
| 210 void* buffer_start = 0; | 208 void* buffer_start = 0; |
| 211 uint32_t buffer_size = 0; | 209 uint32_t buffer_size = 0; |
| 212 if (bytes) { | 210 if (bytes) { |
| 213 buffer_start = env->GetDirectBufferAddress(bytes); | 211 buffer_start = env->GetDirectBufferAddress(bytes); |
| 214 DCHECK(buffer_start); | 212 DCHECK(buffer_start); |
| 215 buffer_size = env->GetDirectBufferCapacity(bytes); | 213 buffer_size = env->GetDirectBufferCapacity(bytes); |
| 216 } | 214 } |
| 217 MojoHandle* handles = 0; | 215 MojoHandle* handles = 0; |
| 218 uint32_t num_handles = 0; | 216 uint32_t num_handles = 0; |
| 219 if (handles_buffer) { | 217 if (handles_buffer) { |
| 220 handles = | 218 handles = |
| 221 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); | 219 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); |
| 222 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; | 220 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; |
| 223 } | 221 } |
| 224 MojoResult result = MojoReadMessage( | 222 MojoResult result = MojoReadMessage( |
| 225 mojo_handle, buffer_start, &buffer_size, handles, &num_handles, flags); | 223 mojo_handle, buffer_start, &buffer_size, handles, &num_handles, flags); |
| 226 // Jave code will handle taking ownership of any received handle. | 224 // Jave code will handle taking ownership of any received handle. |
| 227 return Java_CoreImpl_newReadMessageResult( | 225 return Java_CoreImpl_newReadMessageResult(env, result, buffer_size, |
| 228 env, result, buffer_size, num_handles).Release(); | 226 num_handles); |
| 229 } | 227 } |
| 230 | 228 |
| 231 static jobject ReadData(JNIEnv* env, | 229 static ScopedJavaLocalRef<jobject> ReadData(JNIEnv* env, |
| 232 jobject jcaller, | 230 jobject jcaller, |
| 233 jint mojo_handle, | 231 jint mojo_handle, |
| 234 jobject elements, | 232 jobject elements, |
| 235 jint elements_capacity, | 233 jint elements_capacity, |
| 236 jint flags) { | 234 jint flags) { |
| 237 void* buffer_start = 0; | 235 void* buffer_start = 0; |
| 238 uint32_t buffer_size = elements_capacity; | 236 uint32_t buffer_size = elements_capacity; |
| 239 if (elements) { | 237 if (elements) { |
| 240 buffer_start = env->GetDirectBufferAddress(elements); | 238 buffer_start = env->GetDirectBufferAddress(elements); |
| 241 DCHECK(buffer_start); | 239 DCHECK(buffer_start); |
| 242 DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements)); | 240 DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements)); |
| 243 } | 241 } |
| 244 MojoResult result = | 242 MojoResult result = |
| 245 MojoReadData(mojo_handle, buffer_start, &buffer_size, flags); | 243 MojoReadData(mojo_handle, buffer_start, &buffer_size, flags); |
| 246 return Java_CoreImpl_newResultAndInteger( | 244 return Java_CoreImpl_newResultAndInteger( |
| 247 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0) | 245 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0); |
| 248 .Release(); | |
| 249 } | 246 } |
| 250 | 247 |
| 251 static jobject BeginReadData(JNIEnv* env, | 248 static ScopedJavaLocalRef<jobject> BeginReadData(JNIEnv* env, |
| 252 jobject jcaller, | 249 jobject jcaller, |
| 253 jint mojo_handle, | 250 jint mojo_handle, |
| 254 jint num_bytes, | 251 jint num_bytes, |
| 255 jint flags) { | 252 jint flags) { |
| 256 void const* buffer = 0; | 253 void const* buffer = 0; |
| 257 uint32_t buffer_size = num_bytes; | 254 uint32_t buffer_size = num_bytes; |
| 258 MojoResult result = | 255 MojoResult result = |
| 259 MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags); | 256 MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags); |
| 260 jobject byte_buffer = 0; | 257 jobject byte_buffer = 0; |
| 261 if (result == MOJO_RESULT_OK) { | 258 if (result == MOJO_RESULT_OK) { |
| 262 byte_buffer = | 259 byte_buffer = |
| 263 env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size); | 260 env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size); |
| 264 } | 261 } |
| 265 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer).Release(); | 262 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer); |
| 266 } | 263 } |
| 267 | 264 |
| 268 static jint EndReadData(JNIEnv* env, | 265 static jint EndReadData(JNIEnv* env, |
| 269 jobject jcaller, | 266 jobject jcaller, |
| 270 jint mojo_handle, | 267 jint mojo_handle, |
| 271 jint num_bytes_read) { | 268 jint num_bytes_read) { |
| 272 return MojoEndReadData(mojo_handle, num_bytes_read); | 269 return MojoEndReadData(mojo_handle, num_bytes_read); |
| 273 } | 270 } |
| 274 | 271 |
| 275 static jobject WriteData(JNIEnv* env, | 272 static ScopedJavaLocalRef<jobject> WriteData(JNIEnv* env, |
| 276 jobject jcaller, | 273 jobject jcaller, |
| 277 jint mojo_handle, | 274 jint mojo_handle, |
| 278 jobject elements, | 275 jobject elements, |
| 279 jint limit, | 276 jint limit, |
| 280 jint flags) { | 277 jint flags) { |
| 281 void* buffer_start = env->GetDirectBufferAddress(elements); | 278 void* buffer_start = env->GetDirectBufferAddress(elements); |
| 282 DCHECK(buffer_start); | 279 DCHECK(buffer_start); |
| 283 DCHECK(limit <= env->GetDirectBufferCapacity(elements)); | 280 DCHECK(limit <= env->GetDirectBufferCapacity(elements)); |
| 284 uint32_t buffer_size = limit; | 281 uint32_t buffer_size = limit; |
| 285 MojoResult result = | 282 MojoResult result = |
| 286 MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags); | 283 MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags); |
| 287 return Java_CoreImpl_newResultAndInteger( | 284 return Java_CoreImpl_newResultAndInteger( |
| 288 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0) | 285 env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0); |
| 289 .Release(); | |
| 290 } | 286 } |
| 291 | 287 |
| 292 static jobject BeginWriteData(JNIEnv* env, | 288 static ScopedJavaLocalRef<jobject> BeginWriteData(JNIEnv* env, |
| 293 jobject jcaller, | 289 jobject jcaller, |
| 294 jint mojo_handle, | 290 jint mojo_handle, |
| 295 jint num_bytes, | 291 jint num_bytes, |
| 296 jint flags) { | 292 jint flags) { |
| 297 void* buffer = 0; | 293 void* buffer = 0; |
| 298 uint32_t buffer_size = num_bytes; | 294 uint32_t buffer_size = num_bytes; |
| 299 MojoResult result = | 295 MojoResult result = |
| 300 MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags); | 296 MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags); |
| 301 jobject byte_buffer = 0; | 297 jobject byte_buffer = 0; |
| 302 if (result == MOJO_RESULT_OK) { | 298 if (result == MOJO_RESULT_OK) { |
| 303 byte_buffer = env->NewDirectByteBuffer(buffer, buffer_size); | 299 byte_buffer = env->NewDirectByteBuffer(buffer, buffer_size); |
| 304 } | 300 } |
| 305 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer).Release(); | 301 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer); |
| 306 } | 302 } |
| 307 | 303 |
| 308 static jint EndWriteData(JNIEnv* env, | 304 static jint EndWriteData(JNIEnv* env, |
| 309 jobject jcaller, | 305 jobject jcaller, |
| 310 jint mojo_handle, | 306 jint mojo_handle, |
| 311 jint num_bytes_written) { | 307 jint num_bytes_written) { |
| 312 return MojoEndWriteData(mojo_handle, num_bytes_written); | 308 return MojoEndWriteData(mojo_handle, num_bytes_written); |
| 313 } | 309 } |
| 314 | 310 |
| 315 static jobject Duplicate(JNIEnv* env, | 311 static ScopedJavaLocalRef<jobject> Duplicate(JNIEnv* env, |
| 316 jobject jcaller, | 312 jobject jcaller, |
| 317 jint mojo_handle, | 313 jint mojo_handle, |
| 318 jobject options_buffer) { | 314 jobject options_buffer) { |
| 319 const MojoDuplicateBufferHandleOptions* options = 0; | 315 const MojoDuplicateBufferHandleOptions* options = 0; |
| 320 if (options_buffer) { | 316 if (options_buffer) { |
| 321 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | 317 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); |
| 322 DCHECK(buffer_start); | 318 DCHECK(buffer_start); |
| 323 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | 319 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); |
| 324 DCHECK_EQ(buffer_size, sizeof(MojoDuplicateBufferHandleOptions)); | 320 DCHECK_EQ(buffer_size, sizeof(MojoDuplicateBufferHandleOptions)); |
| 325 options = | 321 options = |
| 326 static_cast<const MojoDuplicateBufferHandleOptions*>(buffer_start); | 322 static_cast<const MojoDuplicateBufferHandleOptions*>(buffer_start); |
| 327 DCHECK_EQ(options->struct_size, buffer_size); | 323 DCHECK_EQ(options->struct_size, buffer_size); |
| 328 } | 324 } |
| 329 MojoHandle handle; | 325 MojoHandle handle; |
| 330 MojoResult result = MojoDuplicateBufferHandle(mojo_handle, options, &handle); | 326 MojoResult result = MojoDuplicateBufferHandle(mojo_handle, options, &handle); |
| 331 return Java_CoreImpl_newResultAndInteger(env, result, handle).Release(); | 327 return Java_CoreImpl_newResultAndInteger(env, result, handle); |
| 332 } | 328 } |
| 333 | 329 |
| 334 static jobject Map(JNIEnv* env, | 330 static ScopedJavaLocalRef<jobject> Map(JNIEnv* env, |
| 335 jobject jcaller, | 331 jobject jcaller, |
| 336 jint mojo_handle, | 332 jint mojo_handle, |
| 337 jlong offset, | 333 jlong offset, |
| 338 jlong num_bytes, | 334 jlong num_bytes, |
| 339 jint flags) { | 335 jint flags) { |
| 340 void* buffer = 0; | 336 void* buffer = 0; |
| 341 MojoResult result = | 337 MojoResult result = |
| 342 MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags); | 338 MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags); |
| 343 jobject byte_buffer = 0; | 339 jobject byte_buffer = 0; |
| 344 if (result == MOJO_RESULT_OK) { | 340 if (result == MOJO_RESULT_OK) { |
| 345 byte_buffer = env->NewDirectByteBuffer(buffer, num_bytes); | 341 byte_buffer = env->NewDirectByteBuffer(buffer, num_bytes); |
| 346 } | 342 } |
| 347 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer).Release(); | 343 return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer); |
| 348 } | 344 } |
| 349 | 345 |
| 350 static int Unmap(JNIEnv* env, jobject jcaller, jobject buffer) { | 346 static int Unmap(JNIEnv* env, jobject jcaller, jobject buffer) { |
| 351 void* buffer_start = env->GetDirectBufferAddress(buffer); | 347 void* buffer_start = env->GetDirectBufferAddress(buffer); |
| 352 DCHECK(buffer_start); | 348 DCHECK(buffer_start); |
| 353 return MojoUnmapBuffer(buffer_start); | 349 return MojoUnmapBuffer(buffer_start); |
| 354 } | 350 } |
| 355 | 351 |
| 356 static jobject AsyncWait(JNIEnv* env, | 352 static ScopedJavaLocalRef<jobject> AsyncWait(JNIEnv* env, |
| 357 jobject jcaller, | 353 jobject jcaller, |
| 358 jint mojo_handle, | 354 jint mojo_handle, |
| 359 jint signals, | 355 jint signals, |
| 360 jlong deadline, | 356 jlong deadline, |
| 361 jobject callback) { | 357 jobject callback) { |
| 362 AsyncWaitCallbackData* callback_data = | 358 AsyncWaitCallbackData* callback_data = |
| 363 new AsyncWaitCallbackData(env, jcaller, callback); | 359 new AsyncWaitCallbackData(env, jcaller, callback); |
| 364 MojoAsyncWaitID cancel_id; | 360 MojoAsyncWaitID cancel_id; |
| 365 if (static_cast<MojoHandle>(mojo_handle) != MOJO_HANDLE_INVALID) { | 361 if (static_cast<MojoHandle>(mojo_handle) != MOJO_HANDLE_INVALID) { |
| 366 cancel_id = Environment::GetDefaultAsyncWaiter()->AsyncWait( | 362 cancel_id = Environment::GetDefaultAsyncWaiter()->AsyncWait( |
| 367 mojo_handle, signals, deadline, AsyncWaitCallback, callback_data); | 363 mojo_handle, signals, deadline, AsyncWaitCallback, callback_data); |
| 368 } else { | 364 } else { |
| 369 cancel_id = kInvalidHandleCancelID; | 365 cancel_id = kInvalidHandleCancelID; |
| 370 base::MessageLoop::current()->PostTask( | 366 base::MessageLoop::current()->PostTask( |
| 371 FROM_HERE, | 367 FROM_HERE, |
| 372 base::Bind( | 368 base::Bind( |
| 373 &AsyncWaitCallback, callback_data, MOJO_RESULT_INVALID_ARGUMENT)); | 369 &AsyncWaitCallback, callback_data, MOJO_RESULT_INVALID_ARGUMENT)); |
| 374 } | 370 } |
| 375 base::android::ScopedJavaLocalRef<jobject> cancellable = | 371 base::android::ScopedJavaLocalRef<jobject> cancellable = |
| 376 Java_CoreImpl_newAsyncWaiterCancellableImpl( | 372 Java_CoreImpl_newAsyncWaiterCancellableImpl( |
| 377 env, jcaller, cancel_id, reinterpret_cast<intptr_t>(callback_data)); | 373 env, jcaller, cancel_id, reinterpret_cast<intptr_t>(callback_data)); |
| 378 callback_data->cancellable.Reset(env, cancellable.obj()); | 374 callback_data->cancellable.Reset(env, cancellable.obj()); |
| 379 return cancellable.Release(); | 375 return cancellable; |
| 380 } | 376 } |
| 381 | 377 |
| 382 static void CancelAsyncWait(JNIEnv* env, | 378 static void CancelAsyncWait(JNIEnv* env, |
| 383 jobject jcaller, | 379 jobject jcaller, |
| 384 jlong id, | 380 jlong id, |
| 385 jlong data_ptr) { | 381 jlong data_ptr) { |
| 386 if (id == 0) { | 382 if (id == 0) { |
| 387 // If |id| is |kInvalidHandleCancelID|, the async wait was done on an | 383 // If |id| is |kInvalidHandleCancelID|, the async wait was done on an |
| 388 // invalid handle, so the AsyncWaitCallback will be called and will clear | 384 // invalid handle, so the AsyncWaitCallback will be called and will clear |
| 389 // the data_ptr. | 385 // the data_ptr. |
| 390 return; | 386 return; |
| 391 } | 387 } |
| 392 scoped_ptr<AsyncWaitCallbackData> deleter( | 388 scoped_ptr<AsyncWaitCallbackData> deleter( |
| 393 reinterpret_cast<AsyncWaitCallbackData*>(data_ptr)); | 389 reinterpret_cast<AsyncWaitCallbackData*>(data_ptr)); |
| 394 Environment::GetDefaultAsyncWaiter()->CancelWait(id); | 390 Environment::GetDefaultAsyncWaiter()->CancelWait(id); |
| 395 } | 391 } |
| 396 | 392 |
| 397 static jint GetNativeBufferOffset(JNIEnv* env, | 393 static jint GetNativeBufferOffset(JNIEnv* env, |
| 398 jobject jcaller, | 394 jobject jcaller, |
| 399 jobject buffer, | 395 jobject buffer, |
| 400 jint alignment) { | 396 jint alignment) { |
| 401 jint offset = | 397 jint offset = |
| 402 reinterpret_cast<uintptr_t>(env->GetDirectBufferAddress(buffer)) % | 398 reinterpret_cast<uintptr_t>(env->GetDirectBufferAddress(buffer)) % |
| 403 alignment; | 399 alignment; |
| 404 if (offset == 0) | 400 if (offset == 0) |
| 405 return 0; | 401 return 0; |
| 406 return alignment - offset; | 402 return alignment - offset; |
| 407 } | 403 } |
| 408 | 404 |
| 409 static jobject GetBufferInformation(JNIEnv* env, | 405 static ScopedJavaLocalRef<jobject> GetBufferInformation(JNIEnv* env, |
| 410 jobject jcaller, | 406 jobject jcaller, |
| 411 jint mojo_handle) { | 407 jint mojo_handle) { |
| 412 MojoBufferInformation buffer_information; | 408 MojoBufferInformation buffer_information; |
| 413 MojoResult result = | 409 MojoResult result = |
| 414 MojoGetBufferInformation(static_cast<MojoHandle>(mojo_handle), | 410 MojoGetBufferInformation(static_cast<MojoHandle>(mojo_handle), |
| 415 &buffer_information, sizeof(buffer_information)); | 411 &buffer_information, sizeof(buffer_information)); |
| 416 return Java_CoreImpl_newResultAndBufferInformation( | 412 return Java_CoreImpl_newResultAndBufferInformation( |
| 417 env, result, buffer_information.flags, | 413 env, result, buffer_information.flags, buffer_information.num_bytes); |
| 418 buffer_information.num_bytes) | |
| 419 .Release(); | |
| 420 } | 414 } |
| 421 | 415 |
| 422 bool RegisterCoreImpl(JNIEnv* env) { | 416 bool RegisterCoreImpl(JNIEnv* env) { |
| 423 return RegisterNativesImpl(env); | 417 return RegisterNativesImpl(env); |
| 424 } | 418 } |
| 425 | 419 |
| 426 } // namespace android | 420 } // namespace android |
| 427 } // namespace mojo | 421 } // namespace mojo |
| OLD | NEW |