From b63b46f5867e89dd052fd73f94d67f948917a3bc Mon Sep 17 00:00:00 2001 From: alwu Date: Wed, 7 Apr 2021 04:42:35 +0000 Subject: [PATCH] Bug 1702530 - do not launch RDD process if XPCOM has started shutdown. r=mattwoodrow Differential Revision: https://phabricator.services.mozilla.com/D110982 --- dom/media/ipc/RDDProcessManager.cpp | 18 ++++++++++++------ dom/media/ipc/RDDProcessManager.h | 2 ++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dom/media/ipc/RDDProcessManager.cpp b/dom/media/ipc/RDDProcessManager.cpp index df8c5080008f..2809978887be 100644 --- a/dom/media/ipc/RDDProcessManager.cpp +++ b/dom/media/ipc/RDDProcessManager.cpp @@ -28,6 +28,13 @@ using namespace layers; static StaticAutoPtr sRDDSingleton; +static bool sXPCOMShutdown = false; + +bool RDDProcessManager::IsShutdown() const { + MOZ_ASSERT(NS_IsMainThread()); + return sXPCOMShutdown || !sRDDSingleton; +} + RDDProcessManager* RDDProcessManager::Get() { return sRDDSingleton; } void RDDProcessManager::Initialize() { @@ -71,6 +78,8 @@ RDDProcessManager::Observer::Observe(nsISupports* aSubject, const char* aTopic, } void RDDProcessManager::OnXPCOMShutdown() { + MOZ_ASSERT(NS_IsMainThread()); + sXPCOMShutdown = true; nsContentUtils::UnregisterShutdownObserver(mObserver); Preferences::RemoveObserver(mObserver, ""); CleanShutdown(); @@ -103,8 +112,7 @@ void RDDProcessManager::OnPreferenceChange(const char16_t* aData) { RefPtr RDDProcessManager::LaunchRDDProcess() { MOZ_ASSERT(NS_IsMainThread()); - if (!Get()) { - // Shutdown? + if (IsShutdown()) { return GenericNonExclusivePromise::CreateAndReject(NS_ERROR_NOT_AVAILABLE, __func__); } @@ -137,8 +145,7 @@ RefPtr RDDProcessManager::LaunchRDDProcess() { mLaunchRDDPromise = mProcess->LaunchPromise()->Then( GetMainThreadSerialEventTarget(), __func__, [this](bool) { - if (!Get()) { - // Shutdown? + if (IsShutdown()) { return GenericNonExclusivePromise::CreateAndReject( NS_ERROR_NOT_AVAILABLE, __func__); } @@ -188,8 +195,7 @@ auto RDDProcessManager::EnsureRDDProcessAndCreateBridge( return LaunchRDDProcess()->Then( GetMainThreadSerialEventTarget(), __func__, [aOtherProcess, this]() { - if (!Get()) { - // Shutdown? + if (IsShutdown()) { return EnsureRDDPromise::CreateAndReject(NS_ERROR_NOT_AVAILABLE, __func__); } diff --git a/dom/media/ipc/RDDProcessManager.h b/dom/media/ipc/RDDProcessManager.h index b803d63d2b5d..c5c2f8fbef78 100644 --- a/dom/media/ipc/RDDProcessManager.h +++ b/dom/media/ipc/RDDProcessManager.h @@ -75,6 +75,8 @@ class RDDProcessManager final : public RDDProcessHost::Listener { void CleanShutdown(); void DestroyProcess(); + bool IsShutdown() const; + DISALLOW_COPY_AND_ASSIGN(RDDProcessManager); class Observer final : public nsIObserver {