Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(851)

Unified Diff: third_party/android_crazy_linker/src/src/crazy_linker_zip.cpp

Issue 958473003: Asynchronously pre-fault the native library pages. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Whitespace. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/android_crazy_linker/src/src/crazy_linker_zip.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/android_crazy_linker/src/src/crazy_linker_zip.cpp
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_zip.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_zip.cpp
index d0a2ff38284e5a491d42da6400b80649ba431c0a..089bb341db9f52cef89ac6ffbb79f7fdf81c6113 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_zip.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_zip.cpp
@@ -34,8 +34,11 @@ const int kOffsetOfStartOfCentralDirInEndOfCentralDirectory =
const uint32_t kCentralDirHeaderMarker = 0x2014b50;
// Offsets of fields in Central Directory Header.
+const int kOffsetCompressedSizeInCentralDirectory = 4 + 2 + 2 + 2 + 2 + 2 + 2 + 4;
+const int kOffsetUncompressedSizeInCentralDirectory =
+ kOffsetCompressedSizeInCentralDirectory + 4;
const int kOffsetFilenameLengthInCentralDirectory =
- 4 + 2 + 2 + 2 + 2 + 2 + 2 + 4 + 4 + 4;
+ kOffsetUncompressedSizeInCentralDirectory + 4;
const int kOffsetExtraFieldLengthInCentralDirectory =
kOffsetFilenameLengthInCentralDirectory + 2;
const int kOffsetCommentLengthInCentralDirectory =
@@ -97,13 +100,16 @@ namespace crazy {
const uint32_t kMaxZipFileLength = 1U << 31; // 2GB
-int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
+
+OffsetSize FindStartOffsetAndLengthOfFileInZipFile(const char* zip_file,
+ const char* filename) {
+ OffsetSize result(CRAZY_OFFSET_FAILED, -1);
// Open the file
FileDescriptor fd;
if (!fd.OpenReadOnly(zip_file)) {
LOG_ERRNO("%s: open failed trying to open zip file %s\n",
__FUNCTION__, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
// Find the length of the file.
@@ -111,13 +117,13 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
if (stat(zip_file, &stat_buf) == -1) {
LOG_ERRNO("%s: stat failed trying to stat zip file %s\n",
__FUNCTION__, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
if (stat_buf.st_size > kMaxZipFileLength) {
LOG("%s: The size %ld of %s is too large to map\n",
__FUNCTION__, stat_buf.st_size, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
// Map the file into memory.
@@ -125,7 +131,7 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
if (mem == MAP_FAILED) {
LOG_ERRNO("%s: mmap failed trying to mmap zip file %s\n",
__FUNCTION__, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
ScopedMMap scoped_mmap(mem, stat_buf.st_size);
@@ -142,7 +148,7 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
if (off == -1) {
LOG("%s: Failed to find end of central directory in %s\n",
__FUNCTION__, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
// We have located the end of central directory record, now locate
@@ -156,14 +162,14 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
if (start_of_central_dir > off) {
LOG("%s: Found out of range offset %u for start of directory in %s\n",
__FUNCTION__, start_of_central_dir, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
uint32_t end_of_central_dir = start_of_central_dir + length_of_central_dir;
if (end_of_central_dir > off) {
LOG("%s: Found out of range offset %u for end of directory in %s\n",
__FUNCTION__, end_of_central_dir, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
uint32_t num_entries = ReadUInt16(
@@ -179,8 +185,12 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
LOG("%s: Failed to find central directory header marker in %s. "
"Found 0x%x but expected 0x%x\n", __FUNCTION__,
zip_file, marker, kCentralDirHeaderMarker);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
+ uint32_t compressed_size =
+ ReadUInt32(mem_bytes, off + kOffsetCompressedSizeInCentralDirectory);
+ uint32_t uncompressed_size =
+ ReadUInt32(mem_bytes, off + kOffsetUncompressedSizeInCentralDirectory);
uint32_t file_name_length =
ReadUInt16(mem_bytes, off + kOffsetFilenameLengthInCentralDirectory);
uint32_t extra_field_length =
@@ -204,7 +214,7 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
LOG("%s: Failed to find local file header marker in %s. "
"Found 0x%x but expected 0x%x\n", __FUNCTION__,
zip_file, marker, kLocalHeaderMarker);
- return CRAZY_OFFSET_FAILED;
+ return result;
}
uint32_t compression_method =
@@ -215,7 +225,13 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
LOG("%s: %s is compressed within %s. "
"Found compression method %u but expected %u\n", __FUNCTION__,
filename, zip_file, compression_method, kCompressionMethodStored);
- return CRAZY_OFFSET_FAILED;
+ return result;
+ }
+
+ if (uncompressed_size != compressed_size) {
+ LOG("%s: Uncompressed size (%d) differs from compressed size (%d).\n",
+ __FUNCTION__, filename, uncompressed_size, compressed_size);
+ return result;
}
uint32_t file_name_length =
@@ -229,7 +245,9 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
uint32_t header_length =
kOffsetFilenameInLocalHeader + file_name_length + extra_field_length;
- return local_header_offset + header_length;
+ result.offset = local_header_offset + header_length;
+ result.size = compressed_size;
+ return result;
}
off += header_length;
@@ -246,7 +264,12 @@ int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
}
LOG("%s: Did not find %s in %s\n", __FUNCTION__, filename, zip_file);
- return CRAZY_OFFSET_FAILED;
+ return result;
+}
+
+
+int FindStartOffsetOfFileInZipFile(const char* zip_file, const char* filename) {
+ return FindStartOffsetAndLengthOfFileInZipFile(zip_file, filename).offset;
}
} // crazy namespace
« no previous file with comments | « third_party/android_crazy_linker/src/src/crazy_linker_zip.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698