Chromium Code Reviews| 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 "base/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/lazy_instance.h" | 6 #include "base/lazy_instance.h" |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/metrics/field_trial.h" | 8 #include "base/metrics/field_trial.h" |
| 9 #include "base/metrics/stats_counters.h" | 9 #include "base/metrics/stats_counters.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 #include "chrome/common/chrome_version_info.h" | 23 #include "chrome/common/chrome_version_info.h" |
| 24 #include "chrome/common/logging_chrome.h" | 24 #include "chrome/common/logging_chrome.h" |
| 25 #include "chrome/common/profiling.h" | 25 #include "chrome/common/profiling.h" |
| 26 #include "chrome/common/url_constants.h" | 26 #include "chrome/common/url_constants.h" |
| 27 #include "chrome/plugin/chrome_content_plugin_client.h" | 27 #include "chrome/plugin/chrome_content_plugin_client.h" |
| 28 #include "chrome/renderer/chrome_content_renderer_client.h" | 28 #include "chrome/renderer/chrome_content_renderer_client.h" |
| 29 #include "chrome/utility/chrome_content_utility_client.h" | 29 #include "chrome/utility/chrome_content_utility_client.h" |
| 30 #include "content/app/content_main.h" | 30 #include "content/app/content_main.h" |
| 31 #include "content/app/content_main_delegate.h" | 31 #include "content/app/content_main_delegate.h" |
| 32 #include "content/browser/renderer_host/render_process_host.h" | 32 #include "content/browser/renderer_host/render_process_host.h" |
| 33 #include "content/renderer/renderer_main.h" | 33 #include "content/renderer/renderer_main.h" |
|
jam
2011/10/04 16:59:22
this isn't needed anymore. we now actually don't e
jochen (gone - plz use gerrit)
2011/10/04 18:50:19
Done.
| |
| 34 #include "content/common/content_client.h" | 34 #include "content/common/content_client.h" |
| 35 #include "content/common/content_counters.h" | 35 #include "content/common/content_counters.h" |
| 36 #include "content/common/content_paths.h" | 36 #include "content/common/content_paths.h" |
| 37 #include "content/common/content_switches.h" | 37 #include "content/common/content_switches.h" |
| 38 #include "media/base/media.h" | 38 #include "media/base/media.h" |
| 39 #include "ui/base/resource/resource_bundle.h" | 39 #include "ui/base/resource/resource_bundle.h" |
| 40 #include "ui/base/ui_base_switches.h" | 40 #include "ui/base/ui_base_switches.h" |
| 41 | 41 |
| 42 #if defined(OS_WIN) | 42 #if defined(OS_WIN) |
| 43 #include <algorithm> | 43 #include <algorithm> |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 227 score = kMiscScore; | 227 score = kMiscScore; |
| 228 #ifndef DISABLE_NACL | 228 #ifndef DISABLE_NACL |
| 229 } else if (process_type == switches::kNaClLoaderProcess) { | 229 } else if (process_type == switches::kNaClLoaderProcess) { |
| 230 score = kPluginScore; | 230 score = kPluginScore; |
| 231 #endif | 231 #endif |
| 232 } else if (process_type == switches::kZygoteProcess || | 232 } else if (process_type == switches::kZygoteProcess || |
| 233 process_type.empty()) { | 233 process_type.empty()) { |
| 234 // For zygotes and unlabeled process types, we want to still make | 234 // For zygotes and unlabeled process types, we want to still make |
| 235 // them killable by the OOM killer. | 235 // them killable by the OOM killer. |
| 236 score = kZygoteScore; | 236 score = kZygoteScore; |
| 237 } else if (process_type == switches::kExtensionProcess || | 237 } else if (process_type == switches::kRendererProcess) { |
| 238 process_type == switches::kRendererProcess) { | 238 LOG(WARNING) << "process type 'renderer' " |
| 239 LOG(WARNING) << "process type '" << process_type << "' " | |
| 240 << "should be created through the zygote."; | 239 << "should be created through the zygote."; |
| 241 // When debugging, these process types can end up being run | 240 // When debugging, this process type can end up being run directly, but |
| 242 // directly, but this isn't the typical path for assigning the OOM | 241 // this isn't the typical path for assigning the OOM score for it. Still, |
| 243 // score for them. Still, we want to assign a score that is | 242 // we want to assign a score that is somewhat representative for debugging. |
| 244 // somewhat representative for debugging. | |
| 245 score = kRendererScore; | 243 score = kRendererScore; |
| 246 } else { | 244 } else { |
| 247 NOTREACHED() << "Unknown process type"; | 245 NOTREACHED() << "Unknown process type"; |
| 248 } | 246 } |
| 249 if (score > -1) | 247 if (score > -1) |
| 250 base::AdjustOOMScore(base::GetCurrentProcId(), score); | 248 base::AdjustOOMScore(base::GetCurrentProcId(), score); |
| 251 } | 249 } |
| 252 #endif // defined(OS_LINUX) | 250 #endif // defined(OS_LINUX) |
| 253 | 251 |
| 254 // Enable the heap profiler if the appropriate command-line switch is | 252 // Enable the heap profiler if the appropriate command-line switch is |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 266 &g_chrome_content_renderer_client.Get()); | 264 &g_chrome_content_renderer_client.Get()); |
| 267 } | 265 } |
| 268 | 266 |
| 269 void InitializeChromeContentClient(const std::string& process_type) { | 267 void InitializeChromeContentClient(const std::string& process_type) { |
| 270 if (process_type.empty()) { | 268 if (process_type.empty()) { |
| 271 content::GetContentClient()->set_browser( | 269 content::GetContentClient()->set_browser( |
| 272 &g_chrome_content_browser_client.Get()); | 270 &g_chrome_content_browser_client.Get()); |
| 273 } else if (process_type == switches::kPluginProcess) { | 271 } else if (process_type == switches::kPluginProcess) { |
| 274 content::GetContentClient()->set_plugin( | 272 content::GetContentClient()->set_plugin( |
| 275 &g_chrome_content_plugin_client.Get()); | 273 &g_chrome_content_plugin_client.Get()); |
| 276 } else if (process_type == switches::kRendererProcess || | 274 } else if (process_type == switches::kRendererProcess) { |
| 277 process_type == switches::kExtensionProcess) { | |
| 278 InitializeChromeContentRendererClient(); | 275 InitializeChromeContentRendererClient(); |
| 279 } else if (process_type == switches::kUtilityProcess) { | 276 } else if (process_type == switches::kUtilityProcess) { |
| 280 content::GetContentClient()->set_utility( | 277 content::GetContentClient()->set_utility( |
| 281 &g_chrome_content_utility_client.Get()); | 278 &g_chrome_content_utility_client.Get()); |
| 282 } | 279 } |
| 283 } | 280 } |
| 284 | 281 |
| 285 // Returns true if this subprocess type needs the ResourceBundle initialized | 282 // Returns true if this subprocess type needs the ResourceBundle initialized |
| 286 // and resources loaded. | 283 // and resources loaded. |
| 287 bool SubprocessNeedsResourceBundle(const std::string& process_type) { | 284 bool SubprocessNeedsResourceBundle(const std::string& process_type) { |
| 288 return | 285 return |
| 289 #if defined(OS_WIN) || defined(OS_MACOSX) | 286 #if defined(OS_WIN) || defined(OS_MACOSX) |
| 290 // Windows needs resources for the default/null plugin. | 287 // Windows needs resources for the default/null plugin. |
| 291 // Mac needs them for the plugin process name. | 288 // Mac needs them for the plugin process name. |
| 292 process_type == switches::kPluginProcess || | 289 process_type == switches::kPluginProcess || |
| 293 #endif | 290 #endif |
| 294 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 291 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| 295 // The zygote process opens the resources for the renderers. | 292 // The zygote process opens the resources for the renderers. |
| 296 process_type == switches::kZygoteProcess || | 293 process_type == switches::kZygoteProcess || |
| 297 #endif | 294 #endif |
| 298 #if defined(OS_MACOSX) | 295 #if defined(OS_MACOSX) |
| 299 // Mac needs them to for scrollbar related images. | 296 // Mac needs them to for scrollbar related images. |
| 300 process_type == switches::kWorkerProcess || | 297 process_type == switches::kWorkerProcess || |
| 301 #endif | 298 #endif |
| 302 process_type == switches::kRendererProcess || | 299 process_type == switches::kRendererProcess || |
| 303 process_type == switches::kExtensionProcess || | |
| 304 process_type == switches::kUtilityProcess; | 300 process_type == switches::kUtilityProcess; |
| 305 } | 301 } |
| 306 | 302 |
| 307 #if defined(OS_MACOSX) | 303 #if defined(OS_MACOSX) |
| 308 // Update the name shown in Activity Monitor so users are less likely to ask | 304 // Update the name shown in Activity Monitor so users are less likely to ask |
| 309 // why Chrome has so many processes. | 305 // why Chrome has so many processes. |
| 310 void SetMacProcessName(const std::string& process_type) { | 306 void SetMacProcessName(const std::string& process_type) { |
| 311 // Don't worry about the browser process, its gets the stock name. | 307 // Don't worry about the browser process, its gets the stock name. |
| 312 int name_id = 0; | 308 int name_id = 0; |
| 313 if (process_type == switches::kRendererProcess) { | 309 if (process_type == switches::kRendererProcess) { |
| 314 name_id = IDS_RENDERER_APP_NAME; | 310 name_id = IDS_RENDERER_APP_NAME; |
| 315 } else if (process_type == switches::kPluginProcess || | 311 } else if (process_type == switches::kPluginProcess || |
| 316 process_type == switches::kPpapiPluginProcess) { | 312 process_type == switches::kPpapiPluginProcess) { |
| 317 name_id = IDS_PLUGIN_APP_NAME; | 313 name_id = IDS_PLUGIN_APP_NAME; |
| 318 } else if (process_type == switches::kExtensionProcess) { | |
| 319 name_id = IDS_WORKER_APP_NAME; | |
|
jam
2011/10/04 16:59:22
do we want to use this in the "process_type == swi
jochen (gone - plz use gerrit)
2011/10/04 18:50:19
Done.
| |
| 320 } else if (process_type == switches::kUtilityProcess) { | 314 } else if (process_type == switches::kUtilityProcess) { |
| 321 name_id = IDS_UTILITY_APP_NAME; | 315 name_id = IDS_UTILITY_APP_NAME; |
| 322 } | 316 } |
| 323 if (name_id) { | 317 if (name_id) { |
| 324 NSString* app_name = l10n_util::GetNSString(name_id); | 318 NSString* app_name = l10n_util::GetNSString(name_id); |
| 325 base::mac::SetProcessName(base::mac::NSToCFCast(app_name)); | 319 base::mac::SetProcessName(base::mac::NSToCFCast(app_name)); |
| 326 } | 320 } |
| 327 } | 321 } |
| 328 | 322 |
| 329 #endif // defined(OS_MACOSX) | 323 #endif // defined(OS_MACOSX) |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 639 // AdjustLinuxOOMScore function too. | 633 // AdjustLinuxOOMScore function too. |
| 640 #if defined(OS_LINUX) | 634 #if defined(OS_LINUX) |
| 641 AdjustLinuxOOMScore(process_type); | 635 AdjustLinuxOOMScore(process_type); |
| 642 #endif | 636 #endif |
| 643 } | 637 } |
| 644 | 638 |
| 645 virtual int RunProcess( | 639 virtual int RunProcess( |
| 646 const std::string& process_type, | 640 const std::string& process_type, |
| 647 const MainFunctionParams& main_function_params) OVERRIDE { | 641 const MainFunctionParams& main_function_params) OVERRIDE { |
| 648 static const MainFunction kMainFunctions[] = { | 642 static const MainFunction kMainFunctions[] = { |
| 649 // An extension process is just a renderer process. We use a different | |
| 650 // command line argument to differentiate crash reports. | |
| 651 { switches::kExtensionProcess, RendererMain }, | |
| 652 { switches::kServiceProcess, ServiceProcessMain }, | 643 { switches::kServiceProcess, ServiceProcessMain }, |
| 653 #if defined(OS_MACOSX) | 644 #if defined(OS_MACOSX) |
| 654 { switches::kRelauncherProcess, | 645 { switches::kRelauncherProcess, |
| 655 mac_relauncher::internal::RelauncherMain }, | 646 mac_relauncher::internal::RelauncherMain }, |
| 656 #endif | 647 #endif |
| 657 #if !defined(DISABLE_NACL) | 648 #if !defined(DISABLE_NACL) |
| 658 { switches::kNaClLoaderProcess, NaClMain }, | 649 { switches::kNaClLoaderProcess, NaClMain }, |
| 659 #endif // DISABLE_NACL | 650 #endif // DISABLE_NACL |
| 660 }; | 651 }; |
| 661 | 652 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 676 | 667 |
| 677 #if defined(OS_MACOSX) && defined(GOOGLE_CHROME_BUILD) | 668 #if defined(OS_MACOSX) && defined(GOOGLE_CHROME_BUILD) |
| 678 // TODO(mark): See the TODO(mark) at InitCrashReporter. | 669 // TODO(mark): See the TODO(mark) at InitCrashReporter. |
| 679 DestructCrashReporter(); | 670 DestructCrashReporter(); |
| 680 #endif // OS_MACOSX && GOOGLE_CHROME_BUILD | 671 #endif // OS_MACOSX && GOOGLE_CHROME_BUILD |
| 681 } | 672 } |
| 682 | 673 |
| 683 #if defined(OS_MACOSX) | 674 #if defined(OS_MACOSX) |
| 684 virtual bool ProcessRegistersWithSystemProcess( | 675 virtual bool ProcessRegistersWithSystemProcess( |
| 685 const std::string& process_type) OVERRIDE { | 676 const std::string& process_type) OVERRIDE { |
| 686 return process_type == switches::kNaClLoaderProcess || | 677 return process_type == switches::kNaClLoaderProcess; |
| 687 process_type == switches::kExtensionProcess; | |
| 688 } | 678 } |
| 689 | 679 |
| 690 virtual bool ShouldSendMachPort(const std::string& process_type) OVERRIDE { | 680 virtual bool ShouldSendMachPort(const std::string& process_type) OVERRIDE { |
| 691 return process_type != switches::kRelauncherProcess && | 681 return process_type != switches::kRelauncherProcess && |
| 692 process_type != switches::kServiceProcess; | 682 process_type != switches::kServiceProcess; |
| 693 } | 683 } |
| 694 | 684 |
| 695 virtual bool DelaySandboxInitialization( | 685 virtual bool DelaySandboxInitialization( |
| 696 const std::string& process_type) OVERRIDE { | 686 const std::string& process_type) OVERRIDE { |
| 697 // Extensions are really renderers. | |
| 698 // NaClLoader does this in NaClMainPlatformDelegate::EnableSandbox(). | 687 // NaClLoader does this in NaClMainPlatformDelegate::EnableSandbox(). |
| 699 // No sandbox needed for relauncher. | 688 // No sandbox needed for relauncher. |
| 700 return process_type == switches::kExtensionProcess || | 689 return process_type == switches::kNaClLoaderProcess || |
| 701 process_type == switches::kNaClLoaderProcess || | |
| 702 process_type == switches::kRelauncherProcess; | 690 process_type == switches::kRelauncherProcess; |
| 703 } | 691 } |
| 704 #elif defined(OS_POSIX) | 692 #elif defined(OS_POSIX) |
| 705 virtual ZygoteForkDelegate* ZygoteStarting() OVERRIDE { | 693 virtual ZygoteForkDelegate* ZygoteStarting() OVERRIDE { |
| 706 // Each Renderer we spawn will re-attempt initialization of the media | 694 // Each Renderer we spawn will re-attempt initialization of the media |
| 707 // libraries, at which point failure will be detected and handled, so | 695 // libraries, at which point failure will be detected and handled, so |
| 708 // we do not need to cope with initialization failures here. | 696 // we do not need to cope with initialization failures here. |
| 709 FilePath media_path; | 697 FilePath media_path; |
| 710 if (PathService::Get(chrome::DIR_MEDIA_LIBS, &media_path)) | 698 if (PathService::Get(chrome::DIR_MEDIA_LIBS, &media_path)) |
| 711 media::InitializeMediaLibrary(media_path); | 699 media::InitializeMediaLibrary(media_path); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 742 DLLEXPORT int __cdecl ChromeMain(HINSTANCE instance, | 730 DLLEXPORT int __cdecl ChromeMain(HINSTANCE instance, |
| 743 sandbox::SandboxInterfaceInfo* sandbox_info) { | 731 sandbox::SandboxInterfaceInfo* sandbox_info) { |
| 744 ChromeMainDelegate chrome_main_delegate; | 732 ChromeMainDelegate chrome_main_delegate; |
| 745 return content::ContentMain(instance, sandbox_info, &chrome_main_delegate); | 733 return content::ContentMain(instance, sandbox_info, &chrome_main_delegate); |
| 746 #elif defined(OS_POSIX) | 734 #elif defined(OS_POSIX) |
| 747 int ChromeMain(int argc, const char** argv) { | 735 int ChromeMain(int argc, const char** argv) { |
| 748 ChromeMainDelegate chrome_main_delegate; | 736 ChromeMainDelegate chrome_main_delegate; |
| 749 return content::ContentMain(argc, argv, &chrome_main_delegate); | 737 return content::ContentMain(argc, argv, &chrome_main_delegate); |
| 750 #endif | 738 #endif |
| 751 } | 739 } |
| OLD | NEW |