| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |