From 0aefa4e196bdeeac70f7782018c40d71f190c294 Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Thu, 11 Feb 2021 17:31:37 -0500 Subject: [PATCH] Mac: Fix incorrect creation of NSAutoreleasePool (fixes issue #2160) --- patch/patches/content_main_654986.patch | 83 ++++++++++++------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/patch/patches/content_main_654986.patch b/patch/patches/content_main_654986.patch index 2f36fccc3..55210d8c5 100644 --- a/patch/patches/content_main_654986.patch +++ b/patch/patches/content_main_654986.patch @@ -1,5 +1,5 @@ diff --git content/app/content_main.cc content/app/content_main.cc -index 2aba28d210db..5413f08af93d 100644 +index 2aba28d210db..00edc202e2c4 100644 --- content/app/content_main.cc +++ content/app/content_main.cc @@ -205,15 +205,10 @@ void InitializeMojo(mojo::core::Configuration* config) { @@ -20,17 +20,20 @@ index 2aba28d210db..5413f08af93d 100644 // A flag to indicate whether Main() has been called before. On Android, we // may re-run Main() without restarting the browser process. This flag -@@ -299,8 +294,7 @@ int RunContentProcess(const ContentMainParams& params, - // 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. +@@ -295,12 +290,6 @@ int RunContentProcess(const ContentMainParams& params, + #endif + + #if defined(OS_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. - autorelease_pool = std::make_unique(); - content_main_params.autorelease_pool = autorelease_pool.get(); -+ params.autorelease_pool = std::make_unique(); InitializeMac(); #endif -@@ -310,7 +304,7 @@ int RunContentProcess(const ContentMainParams& params, +@@ -310,7 +299,7 @@ int RunContentProcess(const ContentMainParams& params, ui::RegisterPathProvider(); tracker = base::debug::GlobalActivityTracker::Get(); @@ -39,7 +42,7 @@ index 2aba28d210db..5413f08af93d 100644 if (exit_code >= 0) { if (tracker) { -@@ -369,8 +363,16 @@ int RunContentProcess(const ContentMainParams& params, +@@ -369,8 +358,16 @@ int RunContentProcess(const ContentMainParams& params, if (IsSubprocess()) CommonSubprocessInit(); @@ -57,7 +60,7 @@ index 2aba28d210db..5413f08af93d 100644 if (tracker) { if (exit_code == 0) { tracker->SetProcessPhaseIfEnabled( -@@ -381,19 +383,33 @@ int RunContentProcess(const ContentMainParams& params, +@@ -381,19 +378,45 @@ int RunContentProcess(const ContentMainParams& params, tracker->process_data().SetInt("exit-code", exit_code); } } @@ -67,24 +70,38 @@ index 2aba28d210db..5413f08af93d 100644 +void ContentMainShutdown(ContentMainParams& params, + ContentMainRunner* content_main_runner) { - #if defined(OS_MAC) -- autorelease_pool.reset(); -+ params.autorelease_pool.reset(); - #endif - - #if !defined(OS_ANDROID) - content_main_runner->Shutdown(); - #endif ++#if !defined(OS_ANDROID) ++ content_main_runner->Shutdown(); ++#endif +} + +int RunContentProcess(ContentMainParams& params, + ContentMainRunner* content_main_runner) { + #if defined(OS_MAC) +- autorelease_pool.reset(); ++ // 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. ++ std::unique_ptr autorelease_pool = ++ std::make_unique(); ++ params.autorelease_pool = autorelease_pool.get(); + #endif + +-#if !defined(OS_ANDROID) +- content_main_runner->Shutdown(); + int exit_code = ContentMainInitialize(params, content_main_runner); + if (exit_code >= 0) + return exit_code; + exit_code = ContentMainRun(params, content_main_runner); -+ ContentMainShutdown(params, content_main_runner); ++ ++#if defined(OS_MAC) ++ params.autorelease_pool = nullptr; ++ autorelease_pool.reset(); + #endif ++ ContentMainShutdown(params, content_main_runner); ++ return exit_code; } @@ -94,7 +111,7 @@ index 2aba28d210db..5413f08af93d 100644 return RunContentProcess(params, runner.get()); } diff --git content/app/content_main_runner_impl.cc content/app/content_main_runner_impl.cc -index 1f05e6351c58..4de74fb3cf50 100644 +index 1f05e6351c58..cf0ef2f0a0bb 100644 --- content/app/content_main_runner_impl.cc +++ content/app/content_main_runner_impl.cc @@ -48,6 +48,7 @@ @@ -105,15 +122,6 @@ index 1f05e6351c58..4de74fb3cf50 100644 #include "base/trace_event/trace_event.h" #include "components/discardable_memory/service/discardable_shared_memory_manager.h" #include "components/download/public/common/download_task_runner.h" -@@ -631,7 +632,7 @@ int ContentMainRunnerImpl::Initialize(const ContentMainParams& params) { - #else // !OS_WIN - - #if defined(OS_MAC) -- autorelease_pool_ = params.autorelease_pool; -+ autorelease_pool_ = params.autorelease_pool.get(); - #endif // defined(OS_MAC) - - #if defined(OS_ANDROID) @@ -1098,6 +1099,11 @@ void ContentMainRunnerImpl::Shutdown() { is_shutdown_ = true; } @@ -162,23 +170,10 @@ index 8b829a488773..a69a08869728 100644 if (main_argv) setproctitle_init(main_argv); diff --git content/public/app/content_main.h content/public/app/content_main.h -index 97aac3d0c758..4e7baa790252 100644 +index 97aac3d0c758..fc795ae0287f 100644 --- content/public/app/content_main.h +++ content/public/app/content_main.h -@@ -5,6 +5,7 @@ - #ifndef CONTENT_PUBLIC_APP_CONTENT_MAIN_H_ - #define CONTENT_PUBLIC_APP_CONTENT_MAIN_H_ - -+#include - #include - - #include "base/callback_forward.h" -@@ -64,11 +65,20 @@ struct ContentMainParams { - - #if defined(OS_MAC) - // The outermost autorelease pool to pass to main entry points. -- base::mac::ScopedNSAutoreleasePool* autorelease_pool = nullptr; -+ std::unique_ptr autorelease_pool; +@@ -68,7 +68,16 @@ struct ContentMainParams { #endif }; @@ -196,7 +191,7 @@ index 97aac3d0c758..4e7baa790252 100644 ContentMainRunner* content_main_runner); #if defined(OS_ANDROID) -@@ -91,7 +101,7 @@ ContentMainDelegate* GetContentMainDelegate(); +@@ -91,7 +100,7 @@ ContentMainDelegate* GetContentMainDelegate(); // initial setup for every process. The embedder has a chance to customize // startup using the ContentMainDelegate interface. The embedder can also pass // in null for |delegate| if they don't want to override default startup.