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 |