Mac: Fix incorrect creation of NSAutoreleasePool (fixes issue #2160)
This commit is contained in:
parent
d6dc4b667b
commit
7fe6a18f03
|
@ -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 811017f5d455..00e4020dea17 100644
|
||||
index 811017f5d455..57055727e83d 100644
|
||||
--- content/app/content_main_runner_impl.cc
|
||||
+++ content/app/content_main_runner_impl.cc
|
||||
@@ -48,6 +48,7 @@
|
||||
|
@ -105,15 +122,6 @@ index 811017f5d455..00e4020dea17 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"
|
||||
@@ -629,7 +630,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)
|
||||
@@ -1089,6 +1090,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.
|
||||
|
|
Loading…
Reference in New Issue