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))); |
} |