OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/android/library_loader/library_prefetcher.h" | 5 #include "base/android/library_loader/library_prefetcher.h" |
6 | 6 |
7 #include <sys/resource.h> | 7 #include <sys/resource.h> |
8 #include <sys/wait.h> | 8 #include <sys/wait.h> |
9 #include <unistd.h> | 9 #include <unistd.h> |
10 #include <utility> | 10 #include <utility> |
(...skipping 18 matching lines...) Expand all Loading... |
29 // APK. | 29 // APK. |
30 const char* kSuffixesToMatch[] = {kLibchromeSuffix, "base.apk"}; | 30 const char* kSuffixesToMatch[] = {kLibchromeSuffix, "base.apk"}; |
31 | 31 |
32 bool IsReadableAndPrivate(const base::debug::MappedMemoryRegion& region) { | 32 bool IsReadableAndPrivate(const base::debug::MappedMemoryRegion& region) { |
33 return region.permissions & base::debug::MappedMemoryRegion::READ && | 33 return region.permissions & base::debug::MappedMemoryRegion::READ && |
34 region.permissions & base::debug::MappedMemoryRegion::PRIVATE; | 34 region.permissions & base::debug::MappedMemoryRegion::PRIVATE; |
35 } | 35 } |
36 | 36 |
37 bool PathMatchesSuffix(const std::string& path) { | 37 bool PathMatchesSuffix(const std::string& path) { |
38 for (size_t i = 0; i < arraysize(kSuffixesToMatch); i++) { | 38 for (size_t i = 0; i < arraysize(kSuffixesToMatch); i++) { |
39 if (EndsWith(path, kSuffixesToMatch[i], true)) { | 39 if (EndsWith(path, kSuffixesToMatch[i], CompareCase::SENSITIVE)) { |
40 return true; | 40 return true; |
41 } | 41 } |
42 } | 42 } |
43 return false; | 43 return false; |
44 } | 44 } |
45 | 45 |
46 // For each range, reads a byte per page to force it into the page cache. | 46 // For each range, reads a byte per page to force it into the page cache. |
47 // Heap allocations, syscalls and library functions are not allowed in this | 47 // Heap allocations, syscalls and library functions are not allowed in this |
48 // function. | 48 // function. |
49 // Returns true for success. | 49 // Returns true for success. |
(...skipping 25 matching lines...) Expand all Loading... |
75 return PathMatchesSuffix(region.path) && | 75 return PathMatchesSuffix(region.path) && |
76 IsReadableAndPrivate(region); // .text and .data mappings are private. | 76 IsReadableAndPrivate(region); // .text and .data mappings are private. |
77 } | 77 } |
78 | 78 |
79 // static | 79 // static |
80 void NativeLibraryPrefetcher::FilterLibchromeRangesOnlyIfPossible( | 80 void NativeLibraryPrefetcher::FilterLibchromeRangesOnlyIfPossible( |
81 const std::vector<base::debug::MappedMemoryRegion>& regions, | 81 const std::vector<base::debug::MappedMemoryRegion>& regions, |
82 std::vector<AddressRange>* ranges) { | 82 std::vector<AddressRange>* ranges) { |
83 bool has_libchrome_region = false; | 83 bool has_libchrome_region = false; |
84 for (const base::debug::MappedMemoryRegion& region : regions) { | 84 for (const base::debug::MappedMemoryRegion& region : regions) { |
85 if (EndsWith(region.path, kLibchromeSuffix, true)) { | 85 if (EndsWith(region.path, kLibchromeSuffix, CompareCase::SENSITIVE)) { |
86 has_libchrome_region = true; | 86 has_libchrome_region = true; |
87 break; | 87 break; |
88 } | 88 } |
89 } | 89 } |
90 for (const base::debug::MappedMemoryRegion& region : regions) { | 90 for (const base::debug::MappedMemoryRegion& region : regions) { |
91 if (has_libchrome_region && | 91 if (has_libchrome_region && |
92 !EndsWith(region.path, kLibchromeSuffix, true)) { | 92 !EndsWith(region.path, kLibchromeSuffix, CompareCase::SENSITIVE)) { |
93 continue; | 93 continue; |
94 } | 94 } |
95 ranges->push_back(std::make_pair(region.start, region.end)); | 95 ranges->push_back(std::make_pair(region.start, region.end)); |
96 } | 96 } |
97 } | 97 } |
98 | 98 |
99 // static | 99 // static |
100 bool NativeLibraryPrefetcher::FindRanges(std::vector<AddressRange>* ranges) { | 100 bool NativeLibraryPrefetcher::FindRanges(std::vector<AddressRange>* ranges) { |
101 std::string proc_maps; | 101 std::string proc_maps; |
102 if (!base::debug::ReadProcMaps(&proc_maps)) | 102 if (!base::debug::ReadProcMaps(&proc_maps)) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 if (WIFEXITED(status)) { | 141 if (WIFEXITED(status)) { |
142 return WEXITSTATUS(status) == 0; | 142 return WEXITSTATUS(status) == 0; |
143 } | 143 } |
144 } | 144 } |
145 return false; | 145 return false; |
146 } | 146 } |
147 } | 147 } |
148 | 148 |
149 } // namespace android | 149 } // namespace android |
150 } // namespace base | 150 } // namespace base |
OLD | NEW |