mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	Fix DiscardableSharedMemoryManager crash on shutdown with multi-threaded message loop (fixes issue #2798)
This commit is contained in:
		| @@ -613,6 +613,8 @@ void CefContext::FinishShutdownOnUIThread( | ||||
|  | ||||
|   ui::ResourceBundle::GetSharedInstance().CleanupOnUIThread(); | ||||
|  | ||||
|   sm_main_delegate_->ShutdownOnUIThread(); | ||||
|  | ||||
|   if (uithread_shutdown_event) | ||||
|     uithread_shutdown_event->Signal(); | ||||
| } | ||||
|   | ||||
| @@ -442,5 +442,14 @@ patches = [ | ||||
|     # Remove cef_sandbox dependency on boringssl MD5/SHA1 functions. | ||||
|     # https://bitbucket.org/chromiumembedded/cef/issues/2743 | ||||
|     'name': 'base_sandbox_2743', | ||||
|   }, | ||||
|   { | ||||
|     # Fix component build error due to ContentServiceManagerMainDelegate not | ||||
|     # being exported. | ||||
|     # | ||||
|     # Fix DiscardableSharedMemoryManager crash on shutdown with multi-threaded | ||||
|     # message loop. | ||||
|     # https://bitbucket.org/chromiumembedded/cef/issues/2798 | ||||
|     'name': 'content_app_shutdown_2798', | ||||
|   } | ||||
| ] | ||||
|   | ||||
| @@ -1,17 +1,3 @@ | ||||
| diff --git content/app/content_service_manager_main_delegate.h content/app/content_service_manager_main_delegate.h | ||||
| index 864f2a5a315a..78b71d523e86 100644 | ||||
| --- content/app/content_service_manager_main_delegate.h | ||||
| +++ content/app/content_service_manager_main_delegate.h | ||||
| @@ -18,7 +18,8 @@ namespace content { | ||||
|   | ||||
|  class ContentMainRunnerImpl; | ||||
|   | ||||
| -class ContentServiceManagerMainDelegate : public service_manager::MainDelegate { | ||||
| +class CONTENT_EXPORT ContentServiceManagerMainDelegate : | ||||
| +    public service_manager::MainDelegate { | ||||
|   public: | ||||
|    explicit ContentServiceManagerMainDelegate(const ContentMainParams& params); | ||||
|    ~ContentServiceManagerMainDelegate() override; | ||||
| diff --git content/browser/devtools/devtools_instrumentation.h content/browser/devtools/devtools_instrumentation.h | ||||
| index 2207045d28b6..b87d28e8e618 100644 | ||||
| --- content/browser/devtools/devtools_instrumentation.h | ||||
|   | ||||
							
								
								
									
										73
									
								
								patch/patches/content_app_shutdown_2798.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								patch/patches/content_app_shutdown_2798.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| diff --git content/app/content_main_runner_impl.cc content/app/content_main_runner_impl.cc | ||||
| index 579f1767e7cd..84f6494a6a76 100644 | ||||
| --- content/app/content_main_runner_impl.cc | ||||
| +++ content/app/content_main_runner_impl.cc | ||||
| @@ -42,6 +42,7 @@ | ||||
|  #include "base/strings/string_util.h" | ||||
|  #include "base/strings/stringprintf.h" | ||||
|  #include "base/task/post_task.h" | ||||
| +#include "base/threading/thread_restrictions.h" | ||||
|  #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" | ||||
| @@ -999,6 +1000,11 @@ void ContentMainRunnerImpl::Shutdown() { | ||||
|    is_shutdown_ = true; | ||||
|  } | ||||
|   | ||||
| +void ContentMainRunnerImpl::ShutdownOnUIThread() { | ||||
| +  base::ScopedAllowBaseSyncPrimitivesForTesting allow_wait; | ||||
| +  discardable_shared_memory_manager_.reset(); | ||||
| +} | ||||
| + | ||||
|  // static | ||||
|  ContentMainRunner* ContentMainRunner::Create() { | ||||
|    return ContentMainRunnerImpl::Create(); | ||||
| diff --git content/app/content_main_runner_impl.h content/app/content_main_runner_impl.h | ||||
| index 1a76e95cb041..bdd60c054abc 100644 | ||||
| --- content/app/content_main_runner_impl.h | ||||
| +++ content/app/content_main_runner_impl.h | ||||
| @@ -51,6 +51,8 @@ class ContentMainRunnerImpl : public ContentMainRunner { | ||||
|    int Run(bool start_service_manager_only) override; | ||||
|    void Shutdown() override; | ||||
|   | ||||
| +  void ShutdownOnUIThread(); | ||||
| + | ||||
|   private: | ||||
|  #if !defined(CHROME_MULTIPLE_DLL_CHILD) | ||||
|    int RunServiceManager(MainFunctionParams& main_function_params, | ||||
| diff --git content/app/content_service_manager_main_delegate.cc content/app/content_service_manager_main_delegate.cc | ||||
| index c8a728e73782..fe8e3e608acc 100644 | ||||
| --- content/app/content_service_manager_main_delegate.cc | ||||
| +++ content/app/content_service_manager_main_delegate.cc | ||||
| @@ -130,4 +130,8 @@ void ContentServiceManagerMainDelegate::SetStartServiceManagerOnly( | ||||
|    start_service_manager_only_ = start_service_manager_only; | ||||
|  } | ||||
|   | ||||
| +void ContentServiceManagerMainDelegate::ShutdownOnUIThread() { | ||||
| +  content_main_runner_->ShutdownOnUIThread(); | ||||
| +} | ||||
| + | ||||
|  }  // namespace content | ||||
| diff --git content/app/content_service_manager_main_delegate.h content/app/content_service_manager_main_delegate.h | ||||
| index 864f2a5a315a..241052bb5d99 100644 | ||||
| --- content/app/content_service_manager_main_delegate.h | ||||
| +++ content/app/content_service_manager_main_delegate.h | ||||
| @@ -18,7 +18,8 @@ namespace content { | ||||
|   | ||||
|  class ContentMainRunnerImpl; | ||||
|   | ||||
| -class ContentServiceManagerMainDelegate : public service_manager::MainDelegate { | ||||
| +class CONTENT_EXPORT ContentServiceManagerMainDelegate : | ||||
| +    public service_manager::MainDelegate { | ||||
|   public: | ||||
|    explicit ContentServiceManagerMainDelegate(const ContentMainParams& params); | ||||
|    ~ContentServiceManagerMainDelegate() override; | ||||
| @@ -46,6 +47,8 @@ class ContentServiceManagerMainDelegate : public service_manager::MainDelegate { | ||||
|    // full browser. | ||||
|    void SetStartServiceManagerOnly(bool start_service_manager_only); | ||||
|   | ||||
| +  void ShutdownOnUIThread(); | ||||
| + | ||||
|   private: | ||||
|    ContentMainParams content_main_params_; | ||||
|    std::unique_ptr<ContentMainRunnerImpl> content_main_runner_; | ||||
		Reference in New Issue
	
	Block a user