mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	Mac: Fix incorrect creation of NSAutoreleasePool (fixes issue #2160)
This commit is contained in:
		@@ -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<base::mac::ScopedNSAutoreleasePool>();
 | 
			
		||||
-    content_main_params.autorelease_pool = autorelease_pool.get();
 | 
			
		||||
+    params.autorelease_pool = std::make_unique<base::mac::ScopedNSAutoreleasePool>();
 | 
			
		||||
     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<base::mac::ScopedNSAutoreleasePool> autorelease_pool =
 | 
			
		||||
+      std::make_unique<base::mac::ScopedNSAutoreleasePool>();
 | 
			
		||||
+  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 <memory>
 | 
			
		||||
 #include <stddef.h>
 | 
			
		||||
 
 | 
			
		||||
 #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<base::mac::ScopedNSAutoreleasePool> 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.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user