From 7e88fe107ded6d92ac5d17f467b2a6f0fb81d14d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Apr 2015 21:42:49 +0800 Subject: [PATCH] linux: Pass v8 snapshot's fd to child process --- brightray/brightray.gypi | 2 ++ brightray/browser/browser_client.cc | 36 ++++++++++++++++++++++++++++- brightray/browser/browser_client.h | 12 ++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/brightray/brightray.gypi b/brightray/brightray.gypi index 50f5a09b3bc..b1865de7851 100644 --- a/brightray/brightray.gypi +++ b/brightray/brightray.gypi @@ -119,6 +119,8 @@ 'defines': [ # We are using Release version libchromiumcontent: 'NDEBUG', + # Needed by gin: + 'V8_USE_EXTERNAL_STARTUP_DATA', # From skia_for_chromium_defines.gypi: 'SK_SUPPORT_LEGACY_GETTOPDEVICE', 'SK_SUPPORT_LEGACY_BITMAP_CONFIG', diff --git a/brightray/browser/browser_client.cc b/brightray/browser/browser_client.cc index b884cdcdbf1..887ad591d5c 100644 --- a/brightray/browser/browser_client.cc +++ b/brightray/browser/browser_client.cc @@ -12,7 +12,9 @@ #include "base/base_paths.h" #include "base/path_service.h" +#include "content/public/common/content_descriptors.h" #include "content/public/common/url_constants.h" +#include "gin/public/isolate_holder.h" namespace brightray { @@ -27,9 +29,14 @@ BrowserClient* BrowserClient::Get() { } BrowserClient::BrowserClient() - : browser_main_parts_() { + : browser_main_parts_(nullptr) { DCHECK(!g_browser_client); g_browser_client = this; + +#if defined(OS_POSIX) && !defined(OS_MACOSX) + v8_natives_fd_.reset(-1); + v8_snapshot_fd_.reset(-1); +#endif // OS_POSIX && !OS_MACOSX } BrowserClient::~BrowserClient() { @@ -86,4 +93,31 @@ content::DevToolsManagerDelegate* BrowserClient::GetDevToolsManagerDelegate() { return new DevToolsManagerDelegate; } +#if defined(OS_POSIX) && !defined(OS_MACOSX) +void BrowserClient::GetAdditionalMappedFilesForChildProcess( + const base::CommandLine& command_line, + int child_process_id, + content::FileDescriptorInfo* mappings) { + if (v8_snapshot_fd_.get() == -1 && v8_natives_fd_.get() == -1) { + base::FilePath v8_data_path; + PathService::Get(gin::IsolateHolder::kV8SnapshotBasePathKey, &v8_data_path); + DCHECK(!v8_data_path.empty()); + + int file_flags = base::File::FLAG_OPEN | base::File::FLAG_READ; + base::FilePath v8_natives_data_path = + v8_data_path.AppendASCII(gin::IsolateHolder::kNativesFileName); + base::FilePath v8_snapshot_data_path = + v8_data_path.AppendASCII(gin::IsolateHolder::kSnapshotFileName); + base::File v8_natives_data_file(v8_natives_data_path, file_flags); + base::File v8_snapshot_data_file(v8_snapshot_data_path, file_flags); + DCHECK(v8_natives_data_file.IsValid()); + DCHECK(v8_snapshot_data_file.IsValid()); + v8_natives_fd_.reset(v8_natives_data_file.TakePlatformFile()); + v8_snapshot_fd_.reset(v8_snapshot_data_file.TakePlatformFile()); + } + mappings->Share(kV8NativesDataDescriptor, v8_natives_fd_.get()); + mappings->Share(kV8SnapshotDataDescriptor, v8_snapshot_fd_.get()); +} +#endif + } // namespace brightray diff --git a/brightray/browser/browser_client.h b/brightray/browser/browser_client.h index fad326e10bc..cd3c0222310 100644 --- a/brightray/browser/browser_client.h +++ b/brightray/browser/browser_client.h @@ -46,8 +46,20 @@ class BrowserClient : public content::ContentBrowserClient { base::FilePath GetDefaultDownloadDirectory() override; content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override; +#if defined(OS_POSIX) && !defined(OS_MACOSX) + void GetAdditionalMappedFilesForChildProcess( + const base::CommandLine& command_line, + int child_process_id, + content::FileDescriptorInfo* mappings) override; +#endif + BrowserMainParts* browser_main_parts_; +#if defined(OS_POSIX) && !defined(OS_MACOSX) + base::ScopedFD v8_natives_fd_; + base::ScopedFD v8_snapshot_fd_; +#endif // OS_POSIX && !OS_MACOSX + DISALLOW_COPY_AND_ASSIGN(BrowserClient); };