diff options
Diffstat (limited to 'gin/isolate_holder.cc')
-rw-r--r-- | gin/isolate_holder.cc | 62 |
1 files changed, 50 insertions, 12 deletions
diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc index 38215b2..ab18ce4 100644 --- a/gin/isolate_holder.cc +++ b/gin/isolate_holder.cc @@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/message_loop/message_loop.h" #include "base/rand_util.h" +#include "base/strings/sys_string_conversions.h" #include "base/sys_info.h" #include "crypto/sha2.h" #include "gin/array_buffer.h" @@ -42,15 +43,23 @@ base::MemoryMappedFile* g_mapped_natives = NULL; base::MemoryMappedFile* g_mapped_snapshot = NULL; #if defined(V8_USE_EXTERNAL_STARTUP_DATA) -bool MapV8Files(base::FilePath* natives_path, base::FilePath* snapshot_path, - int natives_fd = -1, int snapshot_fd = -1) { +bool MapV8Files(base::FilePath* natives_path, + base::FilePath* snapshot_path, + int natives_fd = -1, + int snapshot_fd = -1, + base::MemoryMappedFile::Region natives_region = + base::MemoryMappedFile::Region::kWholeFile, + base::MemoryMappedFile::Region snapshot_region = + base::MemoryMappedFile::Region::kWholeFile) { int flags = base::File::FLAG_OPEN | base::File::FLAG_READ; g_mapped_natives = new base::MemoryMappedFile; if (!g_mapped_natives->IsValid()) { if (natives_fd == -1 - ? !g_mapped_natives->Initialize(base::File(*natives_path, flags)) - : !g_mapped_natives->Initialize(base::File(natives_fd))) { + ? !g_mapped_natives->Initialize(base::File(*natives_path, flags), + natives_region) + : !g_mapped_natives->Initialize(base::File(natives_fd), + natives_region)) { delete g_mapped_natives; g_mapped_natives = NULL; LOG(FATAL) << "Couldn't mmap v8 natives data file"; @@ -61,8 +70,10 @@ bool MapV8Files(base::FilePath* natives_path, base::FilePath* snapshot_path, g_mapped_snapshot = new base::MemoryMappedFile; if (!g_mapped_snapshot->IsValid()) { if (snapshot_fd == -1 - ? !g_mapped_snapshot->Initialize(base::File(*snapshot_path, flags)) - : !g_mapped_snapshot->Initialize(base::File(snapshot_fd))) { + ? !g_mapped_snapshot->Initialize(base::File(*snapshot_path, flags), + snapshot_region) + : !g_mapped_snapshot->Initialize(base::File(snapshot_fd), + snapshot_region)) { delete g_mapped_snapshot; g_mapped_snapshot = NULL; LOG(ERROR) << "Couldn't mmap v8 snapshot data file"; @@ -106,6 +117,9 @@ extern const unsigned char g_natives_fingerprint[]; extern const unsigned char g_snapshot_fingerprint[]; #endif // V8_VERIFY_EXTERNAL_STARTUP_DATA +const char IsolateHolder::kNativesFileName[] = "natives_blob.bin"; +const char IsolateHolder::kSnapshotFileName[] = "snapshot_blob.bin"; + // static bool IsolateHolder::LoadV8Snapshot() { if (g_mapped_natives && g_mapped_snapshot) @@ -116,13 +130,17 @@ bool IsolateHolder::LoadV8Snapshot() { PathService::Get(v8_snapshot_dir, &data_path); DCHECK(!data_path.empty()); - base::FilePath natives_path = data_path.AppendASCII("natives_blob.bin"); - base::FilePath snapshot_path = data_path.AppendASCII("snapshot_blob.bin"); + base::FilePath natives_path = data_path.AppendASCII(kNativesFileName); + base::FilePath snapshot_path = data_path.AppendASCII(kSnapshotFileName); #else // !defined(OS_MACOSX) + base::ScopedCFTypeRef<CFStringRef> natives_file_name( + base::SysUTF8ToCFStringRef(kNativesFileName)); base::FilePath natives_path = base::mac::PathForFrameworkBundleResource( - CFSTR("natives_blob.bin")); + natives_file_name); + base::ScopedCFTypeRef<CFStringRef> snapshot_file_name( + base::SysUTF8ToCFStringRef(kSnapshotFileName)); base::FilePath snapshot_path = base::mac::PathForFrameworkBundleResource( - CFSTR("snapshot_blob.bin")); + snapshot_file_name); DCHECK(!natives_path.empty()); DCHECK(!snapshot_path.empty()); #endif // !defined(OS_MACOSX) @@ -139,11 +157,31 @@ bool IsolateHolder::LoadV8Snapshot() { } //static -bool IsolateHolder::LoadV8SnapshotFD(int natives_fd, int snapshot_fd) { +bool IsolateHolder::LoadV8SnapshotFd(int natives_fd, + int64 natives_offset, + int64 natives_size, + int snapshot_fd, + int64 snapshot_offset, + int64 snapshot_size) { if (g_mapped_natives && g_mapped_snapshot) return true; - return MapV8Files(NULL, NULL, natives_fd, snapshot_fd); + base::MemoryMappedFile::Region natives_region = + base::MemoryMappedFile::Region::kWholeFile; + if (natives_size != 0 || natives_offset != 0) { + natives_region = + base::MemoryMappedFile::Region(natives_offset, natives_size); + } + + base::MemoryMappedFile::Region snapshot_region = + base::MemoryMappedFile::Region::kWholeFile; + if (natives_size != 0 || natives_offset != 0) { + snapshot_region = + base::MemoryMappedFile::Region(snapshot_offset, snapshot_size); + } + + return MapV8Files( + NULL, NULL, natives_fd, snapshot_fd, natives_region, snapshot_region); } #endif // V8_USE_EXTERNAL_STARTUP_DATA |