From 8f4c21193ab82f60e1f545ab4a9f26f4e8c5c674 Mon Sep 17 00:00:00 2001 From: Mihai Alexandru Michis Date: Tue, 22 Sep 2020 03:54:59 +0300 Subject: [PATCH] Backed out 2 changesets (bug 1663747) for causing xpcshell failures in ThrottledEventQueue. CLOSED TREE Backed out changeset 643aa6baf458 (bug 1663747) Backed out changeset 491472fe44f4 (bug 1663747) --- dom/ipc/ContentParent.cpp | 8 -------- gfx/vr/VRServiceHost.cpp | 5 +---- intl/strres/nsStringBundle.cpp | 14 -------------- js/xpconnect/loader/mozJSComponentLoader.cpp | 7 ++++++- xpcom/base/ClearOnShutdown.cpp | 10 ++++------ xpcom/base/ClearOnShutdown.h | 7 ------- 6 files changed, 11 insertions(+), 40 deletions(-) diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index 38aa1376d2b4f..666af2e96da35 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -2565,14 +2565,6 @@ ContentParent::~ContentParent() { } bool ContentParent::InitInternal(ProcessPriority aInitialPriority) { - // We can't access the locale service after shutdown has started. Since we - // can't init the process without it, and since we're going to be canceling - // whatever load attempt that initiated this process creation anyway, just - // bail out now if shutdown has already started. - if (PastShutdownPhase(ShutdownPhase::Shutdown)) { - return false; - } - XPCOMInitData xpcomInit; MOZ_LOG(ContentParent::GetLog(), LogLevel::Debug, diff --git a/gfx/vr/VRServiceHost.cpp b/gfx/vr/VRServiceHost.cpp index 7250bfe74d8ef..6c39f867fc180 100644 --- a/gfx/vr/VRServiceHost.cpp +++ b/gfx/vr/VRServiceHost.cpp @@ -237,10 +237,7 @@ void VRServiceHost::SendPuppetSubmitToVRProcess( } void VRServiceHost::PuppetReset() { - // If we're already into ShutdownFinal, the VRPuppetCommandBuffer instance - // will have been cleared, so don't try to access it after that point. - if (!mVRProcessEnabled && - !(NS_IsMainThread() && PastShutdownPhase(ShutdownPhase::ShutdownFinal))) { + if (!mVRProcessEnabled) { // Puppet is running in this process, tell it to reset directly. VRPuppetCommandBuffer::Get().Reset(); } diff --git a/intl/strres/nsStringBundle.cpp b/intl/strres/nsStringBundle.cpp index 660e9333bf14c..f4855bcaf1079 100644 --- a/intl/strres/nsStringBundle.cpp +++ b/intl/strres/nsStringBundle.cpp @@ -26,7 +26,6 @@ #include "nsSimpleEnumerator.h" #include "nsStringStream.h" #include "mozilla/BinarySearch.h" -#include "mozilla/ClearOnShutdown.h" #include "mozilla/ResultExtensions.h" #include "mozilla/URLPreloader.h" #include "mozilla/ResultExtensions.h" @@ -484,19 +483,6 @@ nsresult SharedStringBundle::LoadProperties() { return NS_OK; } - MOZ_ASSERT(NS_IsMainThread(), - "String bundles must be initialized on the main thread " - "before they may be used off-main-thread"); - - // We can't access the locale service after shutdown has started, which - // means we can't attempt to load chrome: locale resources (which most of - // our string bundles come from). Since shared string bundles won't be - // useful after shutdown has started anyway (and we almost certainly got - // here from a pre-load attempt in an idle task), just bail out. - if (PastShutdownPhase(ShutdownPhase::Shutdown)) { - return NS_ERROR_ILLEGAL_DURING_SHUTDOWN; - } - // We should only populate shared memory string bundles in the parent // process. Instances in the child process should always be instantiated // with a shared memory file descriptor sent from the parent. diff --git a/js/xpconnect/loader/mozJSComponentLoader.cpp b/js/xpconnect/loader/mozJSComponentLoader.cpp index da11fc2a245ff..ee8741d7342c0 100644 --- a/js/xpconnect/loader/mozJSComponentLoader.cpp +++ b/js/xpconnect/loader/mozJSComponentLoader.cpp @@ -309,6 +309,9 @@ mozJSComponentLoader::~mozJSComponentLoader() { StaticRefPtr mozJSComponentLoader::sSelf; +// True if ShutdownPhase::ShutdownFinal has been reached. +static bool sShutdownFinal = false; + // For terrible compatibility reasons, we need to consider both the global // lexical environment and the global of modules when searching for exported // symbols. @@ -504,6 +507,8 @@ void mozJSComponentLoader::FindTargetObject(JSContext* aCx, void mozJSComponentLoader::InitStatics() { MOZ_ASSERT(!sSelf); sSelf = new mozJSComponentLoader(); + + RunOnShutdown([&] { sShutdownFinal = true; }); } void mozJSComponentLoader::Unload() { @@ -1192,7 +1197,7 @@ nsresult mozJSComponentLoader::Import(JSContext* aCx, !mInProgressImports.Get(info.Key(), &mod)) { // We're trying to import a new JSM, but we're late in shutdown and this // will likely not succeed and might even crash, so fail here. - if (PastShutdownPhase(ShutdownPhase::ShutdownFinal)) { + if (sShutdownFinal) { return NS_ERROR_ILLEGAL_DURING_SHUTDOWN; } diff --git a/xpcom/base/ClearOnShutdown.cpp b/xpcom/base/ClearOnShutdown.cpp index a03dfba044556..33f165839e790 100644 --- a/xpcom/base/ClearOnShutdown.cpp +++ b/xpcom/base/ClearOnShutdown.cpp @@ -16,7 +16,8 @@ ShutdownPhase sCurrentShutdownPhase = ShutdownPhase::NotInShutdown; void InsertIntoShutdownList(ShutdownObserver* aObserver, ShutdownPhase aPhase) { // Adding a ClearOnShutdown for a "past" phase is an error. - if (PastShutdownPhase(aPhase)) { + if (!(static_cast(sCurrentShutdownPhase) < + static_cast(aPhase))) { MOZ_ASSERT(false, "ClearOnShutdown for phase that already was cleared"); aObserver->Shutdown(); delete aObserver; @@ -38,11 +39,8 @@ void KillClearOnShutdown(ShutdownPhase aPhase) { MOZ_ASSERT(NS_IsMainThread()); // Shutdown only goes one direction... - MOZ_ASSERT(!PastShutdownPhase(aPhase)); - - // Set the phase before notifying observers to make sure that they can't run - // any code which isn't allowed to run after the start of this phase. - sCurrentShutdownPhase = aPhase; + MOZ_ASSERT(static_cast(sCurrentShutdownPhase) < + static_cast(aPhase)); // It's impossible to add an entry for a "past" phase; this is blocked in // ClearOnShutdown, but clear them out anyways in case there are phases diff --git a/xpcom/base/ClearOnShutdown.h b/xpcom/base/ClearOnShutdown.h index 522428736c05a..359972a78b980 100644 --- a/xpcom/base/ClearOnShutdown.h +++ b/xpcom/base/ClearOnShutdown.h @@ -129,13 +129,6 @@ inline void RunOnShutdown(CallableT&& aCallable, new FunctionInvoker(std::forward(aCallable)), aPhase); } -inline bool PastShutdownPhase(ShutdownPhase aPhase) { - MOZ_ASSERT(NS_IsMainThread()); - - return size_t(ClearOnShutdown_Internal::sCurrentShutdownPhase) >= - size_t(aPhase); -} - // Called when XPCOM is shutting down, after all shutdown notifications have // been sent and after all threads' event loops have been purged. void KillClearOnShutdown(ShutdownPhase aPhase);