| 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..3b0473a9294ece42c21c18f4cfdcee3122bf8ce8 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 auto_close = files_to_register->OwnsFD(fd);
|
| + 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, auto_close, offset,
|
| + size);
|
| + PCHECK(j_file_info.obj());
|
| + env->SetObjectArrayElement(j_file_infos.obj(), i, j_file_info.obj());
|
| + if (auto_close) {
|
| + 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)));
|
| }
|
|
|
|
|