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

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

Issue 2741033003: Mojo EDK: Introduce MojoQueryHandleSignalsState API (Closed)
Patch Set: fix stupid bad DCHECK Created 3 years, 9 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
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 <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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698