OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/app/chrome_main.h" | 5 #include "chrome/app/chrome_main.h" |
6 | 6 |
7 #include "base/at_exit.h" | 7 #include "base/at_exit.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/debug/debugger.h" | 9 #include "base/debug/debugger.h" |
10 #include "base/i18n/icu_util.h" | 10 #include "base/i18n/icu_util.h" |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 // We are only searching for ASCII characters so this is OK. | 167 // We are only searching for ASCII characters so this is OK. |
168 StringToLowerASCII(&command_line_lower); | 168 StringToLowerASCII(&command_line_lower); |
169 std::wstring::size_type pos = command_line_lower.find(kChromeHtml); | 169 std::wstring::size_type pos = command_line_lower.find(kChromeHtml); |
170 return (pos != std::wstring::npos); | 170 return (pos != std::wstring::npos); |
171 } | 171 } |
172 | 172 |
173 #endif // defined(OS_WIN) | 173 #endif // defined(OS_WIN) |
174 | 174 |
175 #if defined(OS_LINUX) | 175 #if defined(OS_LINUX) |
176 static void AdjustLinuxOOMScore(const std::string& process_type) { | 176 static void AdjustLinuxOOMScore(const std::string& process_type) { |
177 const int kMiscScore = 7; | 177 // Browsers and zygotes should still be killable, but killed last. |
178 #if defined(OS_CHROMEOS) | 178 const int kZygoteScore = 0; |
179 // On ChromeOS, we want plugins to die after the renderers. If this | 179 // The minimum amount to bump a score by. This is large enough that |
180 // works well for ChromeOS, we may do it for Linux as well. | 180 // even if it's translated into the old values, it will still go up |
181 const int kPluginScore = 4; | 181 // by at least one. |
182 #else | 182 const int kScoreBump = 100; |
183 const int kPluginScore = 10; | 183 // This is the lowest score that renderers and extensions start with |
184 #endif | 184 // in the OomPriorityManager. |
| 185 const int kRendererScore = chrome::kLowestRendererOomScore; |
| 186 // For "miscellaneous" things, we want them after renderers, |
| 187 // but before plugins. |
| 188 const int kMiscScore = kRendererScore - kScoreBump; |
| 189 // We want plugins to die after the renderers. |
| 190 const int kPluginScore = kMiscScore - kScoreBump; |
185 int score = -1; | 191 int score = -1; |
186 | 192 |
| 193 DCHECK(kMiscScore > 0); |
| 194 DCHECK(kPluginScore > 0); |
| 195 |
187 if (process_type == switches::kPluginProcess || | 196 if (process_type == switches::kPluginProcess || |
188 process_type == switches::kPpapiPluginProcess) { | 197 process_type == switches::kPpapiPluginProcess) { |
189 score = kPluginScore; | 198 score = kPluginScore; |
190 } else if (process_type == switches::kPpapiBrokerProcess) { | 199 } else if (process_type == switches::kPpapiBrokerProcess) { |
191 // Kill the broker before the plugin. | 200 // The broker should be killed before the PPAPI plugin. |
192 score = kPluginScore + 1; | 201 score = kPluginScore + kScoreBump; |
193 } else if (process_type == switches::kUtilityProcess || | 202 } else if (process_type == switches::kUtilityProcess || |
194 process_type == switches::kWorkerProcess || | 203 process_type == switches::kWorkerProcess || |
195 process_type == switches::kGpuProcess || | 204 process_type == switches::kGpuProcess || |
196 process_type == switches::kServiceProcess) { | 205 process_type == switches::kServiceProcess) { |
197 score = kMiscScore; | 206 score = kMiscScore; |
198 } else if (process_type == switches::kProfileImportProcess) { | 207 } else if (process_type == switches::kProfileImportProcess) { |
199 NOTIMPLEMENTED(); | 208 NOTIMPLEMENTED(); |
| 209 score = kZygoteScore; |
200 #ifndef DISABLE_NACL | 210 #ifndef DISABLE_NACL |
201 } else if (process_type == switches::kNaClLoaderProcess) { | 211 } else if (process_type == switches::kNaClLoaderProcess) { |
202 score = kPluginScore; | 212 score = kPluginScore; |
203 #endif | 213 #endif |
204 } else if (process_type == switches::kZygoteProcess || | 214 } else if (process_type == switches::kZygoteProcess || |
205 process_type.empty()) { | 215 process_type.empty()) { |
206 // Pass - browser / zygote process stays at 0. | 216 // For zygotes and unlabeled process types, we want to still make |
| 217 // them killable by the OOM killer. |
| 218 score = kZygoteScore; |
207 } else if (process_type == switches::kExtensionProcess || | 219 } else if (process_type == switches::kExtensionProcess || |
208 process_type == switches::kRendererProcess) { | 220 process_type == switches::kRendererProcess) { |
209 LOG(WARNING) << "process type '" << process_type << "' " | 221 LOG(WARNING) << "process type '" << process_type << "' " |
210 << "should go through the zygote."; | 222 << "should be created through the zygote."; |
211 // When debugging, these process types can end up being run directly. | 223 // When debugging, these process types can end up being run |
212 return; | 224 // directly, but this isn't the typical path for assigning the OOM |
| 225 // score for them. Still, we want to assign a score that is |
| 226 // somewhat representative for debugging. |
| 227 score = kRendererScore; |
213 } else { | 228 } else { |
214 NOTREACHED() << "Unknown process type"; | 229 NOTREACHED() << "Unknown process type"; |
215 } | 230 } |
216 if (score > -1) | 231 if (score > -1) |
217 base::AdjustOOMScore(base::GetCurrentProcId(), score); | 232 base::AdjustOOMScore(base::GetCurrentProcId(), score); |
218 } | 233 } |
219 #endif // defined(OS_LINUX) | 234 #endif // defined(OS_LINUX) |
220 | 235 |
221 void SetupCRT(const CommandLine& command_line) { | 236 void SetupCRT(const CommandLine& command_line) { |
222 #if defined(OS_WIN) | 237 #if defined(OS_WIN) |
223 #ifdef _CRTDBG_MAP_ALLOC | 238 #if defined(_CRTDBG_MAP_ALLOC) |
224 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); | 239 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); |
225 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); | 240 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); |
226 #else | 241 #else |
227 if (!command_line.HasSwitch(switches::kDisableBreakpad)) { | 242 if (!command_line.HasSwitch(switches::kDisableBreakpad)) { |
228 _CrtSetReportMode(_CRT_ASSERT, 0); | 243 _CrtSetReportMode(_CRT_ASSERT, 0); |
229 } | 244 } |
230 #endif | 245 #endif |
231 #endif | 246 #endif |
232 } | 247 } |
233 | 248 |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 { switches::kGpuProcess, GpuMain }, | 543 { switches::kGpuProcess, GpuMain }, |
529 { switches::kServiceProcess, ServiceProcessMain }, | 544 { switches::kServiceProcess, ServiceProcessMain }, |
530 | 545 |
531 #if defined(OS_MACOSX) | 546 #if defined(OS_MACOSX) |
532 // TODO(port): Use OOP profile import - http://crbug.com/22142 . | 547 // TODO(port): Use OOP profile import - http://crbug.com/22142 . |
533 { switches::kProfileImportProcess, ProfileImportMain }, | 548 { switches::kProfileImportProcess, ProfileImportMain }, |
534 { switches::kRelauncherProcess, mac_relauncher::internal::RelauncherMain }, | 549 { switches::kRelauncherProcess, mac_relauncher::internal::RelauncherMain }, |
535 #endif | 550 #endif |
536 #if !defined(DISABLE_NACL) | 551 #if !defined(DISABLE_NACL) |
537 { switches::kNaClLoaderProcess, NaClMain }, | 552 { switches::kNaClLoaderProcess, NaClMain }, |
538 #ifdef _WIN64 // The broker process is used only on Win64. | 553 #if defined(_WIN64) // The broker process is used only on Win64. |
539 { switches::kNaClBrokerProcess, NaClBrokerMain }, | 554 { switches::kNaClBrokerProcess, NaClBrokerMain }, |
540 #endif | 555 #endif |
541 #endif // DISABLE_NACL | 556 #endif // DISABLE_NACL |
542 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 557 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
543 // Zygote startup is special -- see RunZygote comments above | 558 // Zygote startup is special -- see RunZygote comments above |
544 // for why we don't use ZygoteMain directly. | 559 // for why we don't use ZygoteMain directly. |
545 { switches::kZygoteProcess, RunZygote }, | 560 { switches::kZygoteProcess, RunZygote }, |
546 #endif | 561 #endif |
547 }; | 562 }; |
548 | 563 |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 | 909 |
895 if (SubprocessNeedsResourceBundle(process_type)) | 910 if (SubprocessNeedsResourceBundle(process_type)) |
896 ResourceBundle::CleanupSharedInstance(); | 911 ResourceBundle::CleanupSharedInstance(); |
897 | 912 |
898 logging::CleanupChromeLogging(); | 913 logging::CleanupChromeLogging(); |
899 | 914 |
900 chrome_main::LowLevelShutdown(); | 915 chrome_main::LowLevelShutdown(); |
901 | 916 |
902 return exit_code; | 917 return exit_code; |
903 } | 918 } |
OLD | NEW |