| Index: content/app/android/child_process_service_impl.cc
|
| diff --git a/content/app/android/child_process_service_impl.cc b/content/app/android/child_process_service_impl.cc
|
| index ef6f171beee881cd9fc576659735e426230ad00b..ee268ad2adb4e172a71c151612375b9f8a686017 100644
|
| --- a/content/app/android/child_process_service_impl.cc
|
| +++ b/content/app/android/child_process_service_impl.cc
|
| @@ -8,9 +8,11 @@
|
| #include <cpu-features.h>
|
|
|
| #include "base/android/jni_array.h"
|
| +#include "base/android/jni_string.h"
|
| #include "base/android/library_loader/library_loader_hooks.h"
|
| #include "base/android/memory_pressure_listener_android.h"
|
| #include "base/android/unguessable_token_android.h"
|
| +#include "base/file_descriptor_store.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| @@ -18,10 +20,12 @@
|
| #include "base/unguessable_token.h"
|
| #include "content/child/child_thread_impl.h"
|
| #include "content/public/common/content_descriptors.h"
|
| +#include "content/public/common/content_switches.h"
|
| #include "gpu/ipc/common/android/scoped_surface_request_conduit.h"
|
| #include "gpu/ipc/common/gpu_surface_lookup.h"
|
| #include "ipc/ipc_descriptors.h"
|
| #include "jni/ChildProcessServiceImpl_jni.h"
|
| +#include "services/service_manager/public/cpp/shared_file_util.h"
|
| #include "ui/gl/android/scoped_java_surface.h"
|
| #include "ui/gl/android/surface_texture.h"
|
|
|
| @@ -121,14 +125,49 @@ void InternalInitChildProcessImpl(JNIEnv* env,
|
|
|
| } // namespace <anonymous>
|
|
|
| -void RegisterGlobalFileDescriptor(JNIEnv* env,
|
| - const JavaParamRef<jclass>& clazz,
|
| - jint id,
|
| - jint fd,
|
| - jlong offset,
|
| - jlong size) {
|
| - base::MemoryMappedFile::Region region = {offset, size};
|
| - base::GlobalDescriptors::GetInstance()->Set(id, fd, region);
|
| +void RegisterFileDescriptors(JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + const JavaParamRef<jintArray>& j_ids,
|
| + const JavaParamRef<jintArray>& j_fds,
|
| + const JavaParamRef<jlongArray>& j_offsets,
|
| + const JavaParamRef<jlongArray>& j_sizes) {
|
| + std::vector<int> ids;
|
| + base::android::JavaIntArrayToIntVector(env, j_ids, &ids);
|
| + std::vector<int> fds;
|
| + base::android::JavaIntArrayToIntVector(env, j_fds, &fds);
|
| + std::vector<int64_t> offsets;
|
| + base::android::JavaLongArrayToInt64Vector(env, j_offsets, &offsets);
|
| + std::vector<int64_t> sizes;
|
| + base::android::JavaLongArrayToInt64Vector(env, j_sizes, &sizes);
|
| +
|
| + DCHECK_EQ(ids.size(), fds.size());
|
| + DCHECK_EQ(fds.size(), offsets.size());
|
| + DCHECK_EQ(offsets.size(), sizes.size());
|
| +
|
| + std::map<int, std::string> ids_to_keys;
|
| + std::string file_switch_value =
|
| + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
|
| + switches::kSharedFiles);
|
| + if (!file_switch_value.empty()) {
|
| + base::Optional<std::map<int, std::string>> ids_to_keys_from_command_line =
|
| + service_manager::ParseSharedFileSwitchValue(file_switch_value);
|
| + if (ids_to_keys_from_command_line) {
|
| + ids_to_keys = std::move(*ids_to_keys_from_command_line);
|
| + }
|
| + }
|
| +
|
| + for (size_t i = 0; i < ids.size(); i++) {
|
| + base::MemoryMappedFile::Region region = {offsets.at(i), sizes.at(i)};
|
| + int id = ids.at(i);
|
| + int fd = fds.at(i);
|
| + auto iter = ids_to_keys.find(id);
|
| + if (iter != ids_to_keys.end()) {
|
| + base::FileDescriptorStore::GetInstance().Set(iter->second,
|
| + base::ScopedFD(fd), region);
|
| + } else {
|
| + base::GlobalDescriptors::GetInstance()->Set(id, fd, region);
|
| + }
|
| + }
|
| }
|
|
|
| void InitChildProcessImpl(JNIEnv* env,
|
|
|