| 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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 regions_to_prefetch.push_back(region); | 111 regions_to_prefetch.push_back(region); |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 | 114 |
| 115 FilterLibchromeRangesOnlyIfPossible(regions_to_prefetch, ranges); | 115 FilterLibchromeRangesOnlyIfPossible(regions_to_prefetch, ranges); |
| 116 return true; | 116 return true; |
| 117 } | 117 } |
| 118 | 118 |
| 119 // static | 119 // static |
| 120 bool NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary() { | 120 bool NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary() { |
| 121 // Avoid forking with cygprofile instrumentation because the latter performs |
| 122 // memory allocations. |
| 123 #if defined(CYGPROFILE_INSTRUMENTATION) |
| 124 return false; |
| 125 #endif |
| 126 |
| 121 // Looking for ranges is done before the fork, to avoid syscalls and/or memory | 127 // Looking for ranges is done before the fork, to avoid syscalls and/or memory |
| 122 // allocations in the forked process. The child process inherits the lock | 128 // allocations in the forked process. The child process inherits the lock |
| 123 // state of its parent thread. It cannot rely on being able to acquire any | 129 // state of its parent thread. It cannot rely on being able to acquire any |
| 124 // lock (unless special care is taken in a pre-fork handler), including being | 130 // lock (unless special care is taken in a pre-fork handler), including being |
| 125 // able to call malloc(). | 131 // able to call malloc(). |
| 126 std::vector<AddressRange> ranges; | 132 std::vector<AddressRange> ranges; |
| 127 if (!FindRanges(&ranges)) | 133 if (!FindRanges(&ranges)) |
| 128 return false; | 134 return false; |
| 135 |
| 129 pid_t pid = fork(); | 136 pid_t pid = fork(); |
| 130 if (pid == 0) { | 137 if (pid == 0) { |
| 131 setpriority(PRIO_PROCESS, 0, kBackgroundPriority); | 138 setpriority(PRIO_PROCESS, 0, kBackgroundPriority); |
| 132 // _exit() doesn't call the atexit() handlers. | 139 // _exit() doesn't call the atexit() handlers. |
| 133 _exit(Prefetch(ranges) ? 0 : 1); | 140 _exit(Prefetch(ranges) ? 0 : 1); |
| 134 } else { | 141 } else { |
| 135 if (pid < 0) { | 142 if (pid < 0) { |
| 136 return false; | 143 return false; |
| 137 } | 144 } |
| 138 int status; | 145 int status; |
| 139 const pid_t result = HANDLE_EINTR(waitpid(pid, &status, 0)); | 146 const pid_t result = HANDLE_EINTR(waitpid(pid, &status, 0)); |
| 140 if (result == pid) { | 147 if (result == pid) { |
| 141 if (WIFEXITED(status)) { | 148 if (WIFEXITED(status)) { |
| 142 return WEXITSTATUS(status) == 0; | 149 return WEXITSTATUS(status) == 0; |
| 143 } | 150 } |
| 144 } | 151 } |
| 145 return false; | 152 return false; |
| 146 } | 153 } |
| 147 } | 154 } |
| 148 | 155 |
| 149 } // namespace android | 156 } // namespace android |
| 150 } // namespace base | 157 } // namespace base |
| OLD | NEW |