| diff --git content/app/content_main.cc content/app/content_main.cc |
| index f70a103a45c6d..e880a7ec4b26c 100644 |
| --- content/app/content_main.cc |
| +++ content/app/content_main.cc |
| @@ -174,11 +174,8 @@ ContentMainParams::~ContentMainParams() = default; |
| ContentMainParams::ContentMainParams(ContentMainParams&&) = default; |
| ContentMainParams& ContentMainParams::operator=(ContentMainParams&&) = default; |
| |
| -// This function must be marked with NO_STACK_PROTECTOR or it may crash on |
| -// return, see the --change-stack-guard-on-fork command line flag. |
| -int NO_STACK_PROTECTOR |
| -RunContentProcess(ContentMainParams params, |
| - ContentMainRunner* content_main_runner) { |
| +int ContentMainInitialize(ContentMainParams params, |
| + ContentMainRunner* content_main_runner) { |
| base::FeatureList::FailOnFeatureAccessWithoutFeatureList(); |
| #if BUILDFLAG(IS_CHROMEOS_LACROS) |
| // Lacros is launched with inherited priority. Revert to normal priority |
| @@ -186,9 +183,6 @@ RunContentProcess(ContentMainParams params, |
| base::PlatformThread::SetCurrentThreadType(base::ThreadType::kDefault); |
| #endif |
| int exit_code = -1; |
| -#if BUILDFLAG(IS_MAC) |
| - base::apple::ScopedNSAutoreleasePool autorelease_pool; |
| -#endif |
| |
| // A flag to indicate whether Main() has been called before. On Android, we |
| // may re-run Main() without restarting the browser process. This flag |
| @@ -274,14 +268,6 @@ RunContentProcess(ContentMainParams params, |
| #endif |
| |
| #if BUILDFLAG(IS_MAC) |
| - // We need this pool for all the objects created before we get to the event |
| - // loop, but we don't want to leave them hanging around until the app quits. |
| - // Each "main" needs to flush this pool right before it goes into its main |
| - // event loop to get rid of the cruft. TODO(https://crbug.com/1424190): This |
| - // is not safe. Each main loop should create and destroy its own pool; it |
| - // should not be flushing the pool at the base of the autorelease pool |
| - // stack. |
| - params.autorelease_pool = &autorelease_pool; |
| InitializeMac(); |
| #endif |
| |
| @@ -331,12 +317,46 @@ RunContentProcess(ContentMainParams params, |
| |
| if (IsSubprocess()) |
| CommonSubprocessInit(); |
| - exit_code = content_main_runner->Run(); |
| |
| + return exit_code; |
| +} |
| + |
| +// This function must be marked with NO_STACK_PROTECTOR or it may crash on |
| +// return, see the --change-stack-guard-on-fork command line flag. |
| +int NO_STACK_PROTECTOR |
| +ContentMainRun(ContentMainRunner* content_main_runner) { |
| + return content_main_runner->Run(); |
| +} |
| + |
| +void ContentMainShutdown(ContentMainRunner* content_main_runner) { |
| #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) |
| content_main_runner->Shutdown(); |
| #endif |
| +} |
| + |
| +// This function must be marked with NO_STACK_PROTECTOR or it may crash on |
| +// return, see the --change-stack-guard-on-fork command line flag. |
| +int NO_STACK_PROTECTOR |
| +RunContentProcess(ContentMainParams params, |
| + ContentMainRunner* content_main_runner) { |
| +#if BUILDFLAG(IS_MAC) |
| + // We need this pool for all the objects created before we get to the event |
| + // loop, but we don't want to leave them hanging around until the app quits. |
| + // Each "main" needs to flush this pool right before it goes into its main |
| + // event loop to get rid of the cruft. TODO(https://crbug.com/1424190): This |
| + // is not safe. Each main loop should create and destroy its own pool; it |
| + // should not be flushing the pool at the base of the autorelease pool |
| + // stack. |
| + base::apple::ScopedNSAutoreleasePool autorelease_pool; |
| + params.autorelease_pool = &autorelease_pool; |
| +#endif |
| + |
| + int exit_code = ContentMainInitialize(std::move(params), content_main_runner); |
| + if (exit_code >= 0) |
| + return exit_code; |
| + exit_code = ContentMainRun(content_main_runner); |
| |
| + ContentMainShutdown(content_main_runner); |
| return exit_code; |
| } |
| |
| diff --git content/app/content_main_runner_impl.cc content/app/content_main_runner_impl.cc |
| index 965b07bc43847..89da1178ca765 100644 |
| --- content/app/content_main_runner_impl.cc |
| +++ content/app/content_main_runner_impl.cc |
| @@ -46,6 +46,7 @@ |
| #include "base/task/thread_pool/thread_pool_instance.h" |
| #include "base/threading/hang_watcher.h" |
| #include "base/threading/platform_thread.h" |
| +#include "base/threading/thread_restrictions.h" |
| #include "base/time/time.h" |
| #include "base/trace_event/trace_event.h" |
| #include "build/build_config.h" |
| @@ -1338,6 +1339,11 @@ void ContentMainRunnerImpl::Shutdown() { |
| is_shutdown_ = true; |
| } |
| |
| +void ContentMainRunnerImpl::ShutdownOnUIThread() { |
| + base::ScopedAllowBaseSyncPrimitivesForTesting allow_wait; |
| + discardable_shared_memory_manager_.reset(); |
| +} |
| + |
| // static |
| std::unique_ptr<ContentMainRunner> ContentMainRunner::Create() { |
| return ContentMainRunnerImpl::Create(); |
| diff --git content/app/content_main_runner_impl.h content/app/content_main_runner_impl.h |
| index da60e9346b283..c36effdd7e5ee 100644 |
| --- content/app/content_main_runner_impl.h |
| +++ content/app/content_main_runner_impl.h |
| @@ -27,7 +27,7 @@ class DiscardableSharedMemoryManager; |
| namespace content { |
| class MojoIpcSupport; |
| |
| -class ContentMainRunnerImpl : public ContentMainRunner { |
| +class CONTENT_EXPORT ContentMainRunnerImpl : public ContentMainRunner { |
| public: |
| static std::unique_ptr<ContentMainRunnerImpl> Create(); |
| |
| @@ -46,6 +46,8 @@ class ContentMainRunnerImpl : public ContentMainRunner { |
| int Run() override; |
| void Shutdown() override; |
| |
| + void ShutdownOnUIThread(); |
| + |
| private: |
| int RunBrowser(MainFunctionParams main_function_params, |
| bool start_minimal_browser); |
| diff --git content/common/set_process_title.cc content/common/set_process_title.cc |
| index 283161145d792..9f3f635abdd1c 100644 |
| --- content/common/set_process_title.cc |
| +++ content/common/set_process_title.cc |
| @@ -54,7 +54,7 @@ void SetProcessTitleFromCommandLine(const char** main_argv) { |
| bool have_argv0 = false; |
| |
| #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) |
| - DCHECK_EQ(base::PlatformThread::CurrentId(), getpid()); |
| + // DCHECK_EQ(base::PlatformThread::CurrentId(), getpid()); |
| |
| if (main_argv) |
| setproctitle_init(main_argv); |
| diff --git content/public/app/content_main.h content/public/app/content_main.h |
| index 44d9aa44ae430..47f916f566696 100644 |
| --- content/public/app/content_main.h |
| +++ content/public/app/content_main.h |
| @@ -96,6 +96,13 @@ struct CONTENT_EXPORT ContentMainParams { |
| } |
| }; |
| |
| +// Split RunContentProcess() into separate stages. |
| +CONTENT_EXPORT int ContentMainInitialize( |
| + ContentMainParams params, |
| + ContentMainRunner* content_main_runner); |
| +CONTENT_EXPORT int ContentMainRun(ContentMainRunner* content_main_runner); |
| +CONTENT_EXPORT void ContentMainShutdown(ContentMainRunner* content_main_runner); |
| + |
| CONTENT_EXPORT int RunContentProcess(ContentMainParams params, |
| ContentMainRunner* content_main_runner); |
| |