Chromium Code Reviews| Index: content/browser/android/child_process_launcher_android.cc |
| diff --git a/content/browser/android/child_process_launcher_android.cc b/content/browser/android/child_process_launcher_android.cc |
| index 161493b503dde819b598a99cec879387bd5c307e..8380757ac9bc17256275c196620659b209e0c69e 100644 |
| --- a/content/browser/android/child_process_launcher_android.cc |
| +++ b/content/browser/android/child_process_launcher_android.cc |
| @@ -103,6 +103,7 @@ void StartChildProcess( |
| const base::CommandLine::StringVector& argv, |
| int child_process_id, |
| scoped_ptr<content::FileDescriptorInfo> files_to_register, |
| + const std::map<int, base::MemoryMappedFile::Region>& regions, |
| const StartChildProcessCallback& callback) { |
| JNIEnv* env = AttachCurrentThread(); |
| DCHECK(env); |
| @@ -113,39 +114,37 @@ void StartChildProcess( |
| size_t file_count = files_to_register->GetMappingSize(); |
| DCHECK(file_count > 0); |
| - ScopedJavaLocalRef<jintArray> j_file_ids(env, env->NewIntArray(file_count)); |
| - base::android::CheckException(env); |
| - jint* file_ids = env->GetIntArrayElements(j_file_ids.obj(), NULL); |
| - base::android::CheckException(env); |
| - ScopedJavaLocalRef<jintArray> j_file_fds(env, env->NewIntArray(file_count)); |
| - base::android::CheckException(env); |
| - jint* file_fds = env->GetIntArrayElements(j_file_fds.obj(), NULL); |
| - base::android::CheckException(env); |
| - ScopedJavaLocalRef<jbooleanArray> j_file_auto_close( |
| - env, env->NewBooleanArray(file_count)); |
| - base::android::CheckException(env); |
| - jboolean* file_auto_close = |
| - env->GetBooleanArrayElements(j_file_auto_close.obj(), NULL); |
| + ScopedJavaLocalRef<jclass> j_file_info_class = base::android::GetClass( |
| + env, "org/chromium/content/browser/FileDescriptorInfo"); |
| + ScopedJavaLocalRef<jobjectArray> j_file_infos( |
| + env, env->NewObjectArray(file_count, j_file_info_class.obj(), NULL)); |
| base::android::CheckException(env); |
| + |
| for (size_t i = 0; i < file_count; ++i) { |
| - file_ids[i] = files_to_register->GetIDAt(i); |
| - file_fds[i] = files_to_register->GetFDAt(i); |
| - PCHECK(0 <= file_fds[i]); |
| - file_auto_close[i] = files_to_register->OwnsFD(file_fds[i]); |
| - if (file_auto_close[i]) |
| - ignore_result(files_to_register->ReleaseFD(file_fds[i]).release()); |
| + int fd = files_to_register->GetFDAt(i); |
| + PCHECK(0 <= fd); |
| + int id = files_to_register->GetIDAt(i); |
| + bool autoClose = files_to_register->OwnsFD(fd); |
|
Yaron
2015/05/29 18:29:22
s/autoClose/auto_close/
agrieve
2015/05/29 19:16:40
Done.
|
| + int64 offset = 0L; |
| + int64 size = 0L; |
| + auto found_region_iter = regions.find(id); |
| + if (found_region_iter != regions.end()) { |
| + offset = found_region_iter->second.offset; |
| + size = found_region_iter->second.size; |
| + } |
| + ScopedJavaLocalRef<jobject> j_file_info = |
| + Java_ChildProcessLauncher_makeFdInfo(env, id, fd, autoClose, offset, |
| + size); |
| + PCHECK(j_file_info.obj()); |
| + env->SetObjectArrayElement(j_file_infos.obj(), i, j_file_info.obj()); |
| + if (autoClose) { |
| + ignore_result(files_to_register->ReleaseFD(fd).release()); |
| + } |
| } |
| - env->ReleaseIntArrayElements(j_file_ids.obj(), file_ids, 0); |
| - env->ReleaseIntArrayElements(j_file_fds.obj(), file_fds, 0); |
| - env->ReleaseBooleanArrayElements(j_file_auto_close.obj(), file_auto_close, 0); |
| - |
| - Java_ChildProcessLauncher_start(env, |
| - base::android::GetApplicationContext(), |
| - j_argv.obj(), |
| - child_process_id, |
| - j_file_ids.obj(), |
| - j_file_fds.obj(), |
| - j_file_auto_close.obj(), |
| + |
| + Java_ChildProcessLauncher_start( |
| + env, base::android::GetApplicationContext(), j_argv.obj(), |
| + child_process_id, j_file_infos.obj(), |
| reinterpret_cast<intptr_t>(new StartChildProcessCallback(callback))); |
| } |