| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/android/base_jni_registrar.h" | 10 #include "base/android/base_jni_registrar.h" |
| 11 #include "base/android/jni_android.h" | 11 #include "base/android/jni_android.h" |
| 12 #include "base/android/jni_registrar.h" | 12 #include "base/android/jni_registrar.h" |
| 13 #include "base/android/library_loader/library_loader_hooks.h" | 13 #include "base/android/library_loader/library_loader_hooks.h" |
| 14 #include "base/android/scoped_java_ref.h" | 14 #include "base/android/scoped_java_ref.h" |
| 15 #include "jni/CoreImpl_jni.h" | 15 #include "jni/CoreImpl_jni.h" |
| 16 #include "mojo/public/c/system/core.h" | 16 #include "mojo/public/c/system/core.h" |
| 17 | 17 |
| 18 namespace mojo { | 18 namespace mojo { |
| 19 namespace android { | 19 namespace android { |
| 20 | 20 |
| 21 using base::android::JavaParamRef; | 21 using base::android::JavaParamRef; |
| 22 using base::android::ScopedJavaLocalRef; | 22 using base::android::ScopedJavaLocalRef; |
| 23 | 23 |
| 24 static jlong GetTimeTicksNow(JNIEnv* env, | 24 static jlong GetTimeTicksNow(JNIEnv* env, |
| 25 const JavaParamRef<jobject>& jcaller) { | 25 const JavaParamRef<jobject>& jcaller) { |
| 26 return MojoGetTimeTicksNow(); | 26 return MojoGetTimeTicksNow(); |
| 27 } | 27 } |
| 28 | 28 |
| 29 static jint WaitMany(JNIEnv* env, | |
| 30 const JavaParamRef<jobject>& jcaller, | |
| 31 const JavaParamRef<jobject>& buffer, | |
| 32 jlong deadline) { | |
| 33 // |buffer| contains, in this order | |
| 34 // input: The array of N handles (MojoHandle, 4 bytes each) | |
| 35 // input: The array of N signals (MojoHandleSignals, 4 bytes each) | |
| 36 // space for output: The array of N handle states (MojoHandleSignalsState, 8 | |
| 37 // bytes each) | |
| 38 // space for output: The result index (uint32_t, 4 bytes) | |
| 39 uint8_t* buffer_start = | |
| 40 static_cast<uint8_t*>(env->GetDirectBufferAddress(buffer)); | |
| 41 DCHECK(buffer_start); | |
| 42 DCHECK_EQ(reinterpret_cast<uintptr_t>(buffer_start) % 8, 0u); | |
| 43 // Each handle of the input array contributes 4 (MojoHandle) + 4 | |
| 44 // (MojoHandleSignals) + 8 (MojoHandleSignalsState) = 16 bytes to the size of | |
| 45 // the buffer. | |
| 46 const size_t size_per_handle = 16; | |
| 47 const size_t buffer_size = env->GetDirectBufferCapacity(buffer); | |
| 48 DCHECK_EQ((buffer_size - 4) % size_per_handle, 0u); | |
| 49 | |
| 50 const size_t nb_handles = (buffer_size - 4) / size_per_handle; | |
| 51 const MojoHandle* handle_start = | |
| 52 reinterpret_cast<const MojoHandle*>(buffer_start); | |
| 53 const MojoHandleSignals* signals_start = | |
| 54 reinterpret_cast<const MojoHandleSignals*>(buffer_start + 4 * nb_handles); | |
| 55 MojoHandleSignalsState* states_start = | |
| 56 reinterpret_cast<MojoHandleSignalsState*>(buffer_start + 8 * nb_handles); | |
| 57 uint32_t* result_index = | |
| 58 reinterpret_cast<uint32_t*>(buffer_start + 16 * nb_handles); | |
| 59 *result_index = static_cast<uint32_t>(-1); | |
| 60 return MojoWaitMany(handle_start, signals_start, nb_handles, deadline, | |
| 61 result_index, states_start); | |
| 62 } | |
| 63 | |
| 64 static ScopedJavaLocalRef<jobject> CreateMessagePipe( | 29 static ScopedJavaLocalRef<jobject> CreateMessagePipe( |
| 65 JNIEnv* env, | 30 JNIEnv* env, |
| 66 const JavaParamRef<jobject>& jcaller, | 31 const JavaParamRef<jobject>& jcaller, |
| 67 const JavaParamRef<jobject>& options_buffer) { | 32 const JavaParamRef<jobject>& options_buffer) { |
| 68 const MojoCreateMessagePipeOptions* options = NULL; | 33 const MojoCreateMessagePipeOptions* options = NULL; |
| 69 if (options_buffer) { | 34 if (options_buffer) { |
| 70 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | 35 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); |
| 71 DCHECK(buffer_start); | 36 DCHECK(buffer_start); |
| 72 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); | 37 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); |
| 73 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | 38 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle); | 85 MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle); |
| 121 return Java_CoreImpl_newResultAndInteger(env, result, handle); | 86 return Java_CoreImpl_newResultAndInteger(env, result, handle); |
| 122 } | 87 } |
| 123 | 88 |
| 124 static jint Close(JNIEnv* env, | 89 static jint Close(JNIEnv* env, |
| 125 const JavaParamRef<jobject>& jcaller, | 90 const JavaParamRef<jobject>& jcaller, |
| 126 jint mojo_handle) { | 91 jint mojo_handle) { |
| 127 return MojoClose(mojo_handle); | 92 return MojoClose(mojo_handle); |
| 128 } | 93 } |
| 129 | 94 |
| 130 static jint Wait(JNIEnv* env, | 95 static jint QueryHandleSignalsState(JNIEnv* env, |
| 131 const JavaParamRef<jobject>& jcaller, | 96 const JavaParamRef<jobject>& jcaller, |
| 132 const JavaParamRef<jobject>& buffer, | 97 jint mojo_handle, |
| 133 jint mojo_handle, | 98 const JavaParamRef<jobject>& buffer) { |
| 134 jint signals, | 99 MojoHandleSignalsState* signals_state = |
| 135 jlong deadline) { | 100 static_cast<MojoHandleSignalsState*>(env->GetDirectBufferAddress(buffer)); |
| 136 // Buffer contains space for the MojoHandleSignalsState | 101 DCHECK(signals_state); |
| 137 void* buffer_start = env->GetDirectBufferAddress(buffer); | 102 DCHECK_EQ(sizeof(MojoHandleSignalsState), |
| 138 DCHECK(buffer_start); | |
| 139 DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u); | |
| 140 DCHECK_EQ(sizeof(struct MojoHandleSignalsState), | |
| 141 static_cast<size_t>(env->GetDirectBufferCapacity(buffer))); | 103 static_cast<size_t>(env->GetDirectBufferCapacity(buffer))); |
| 142 struct MojoHandleSignalsState* signals_state = | 104 return MojoQueryHandleSignalsState(mojo_handle, signals_state); |
| 143 static_cast<struct MojoHandleSignalsState*>(buffer_start); | |
| 144 return MojoWait(mojo_handle, signals, deadline, signals_state); | |
| 145 } | 105 } |
| 146 | 106 |
| 147 static jint WriteMessage(JNIEnv* env, | 107 static jint WriteMessage(JNIEnv* env, |
| 148 const JavaParamRef<jobject>& jcaller, | 108 const JavaParamRef<jobject>& jcaller, |
| 149 jint mojo_handle, | 109 jint mojo_handle, |
| 150 const JavaParamRef<jobject>& bytes, | 110 const JavaParamRef<jobject>& bytes, |
| 151 jint num_bytes, | 111 jint num_bytes, |
| 152 const JavaParamRef<jobject>& handles_buffer, | 112 const JavaParamRef<jobject>& handles_buffer, |
| 153 jint flags) { | 113 jint flags) { |
| 154 const void* buffer_start = 0; | 114 const void* buffer_start = 0; |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 return 0; | 300 return 0; |
| 341 return alignment - offset; | 301 return alignment - offset; |
| 342 } | 302 } |
| 343 | 303 |
| 344 bool RegisterCoreImpl(JNIEnv* env) { | 304 bool RegisterCoreImpl(JNIEnv* env) { |
| 345 return RegisterNativesImpl(env); | 305 return RegisterNativesImpl(env); |
| 346 } | 306 } |
| 347 | 307 |
| 348 } // namespace android | 308 } // namespace android |
| 349 } // namespace mojo | 309 } // namespace mojo |
| OLD | NEW |