Bug 1803810 - Part 7: Add NonSharedGlobalSyncModuleLoaderScope::sTlsActiveLoader to hold per-thread loader. r=jonco
☠☠ backed out by 7682952aed89 ☠ ☠
authorTooru Fujisawa <arai_a@mac.com>
Tue, 13 Feb 2024 14:34:23 +0000 (17 months ago)
changeset 695521 9593275c01956136f1909bde5dac28d2c9f11ed2
parent 695520 2e2f01296233a4f7adb3d1fac1c4e67d5f7b16ab
child 695522 c02d879622bdd03e06cd1ecddb9a335f46b6975d
push id199908
push userarai_a@mac.com
push dateTue, 13 Feb 2024 14:42:56 +0000 (17 months ago)
treeherderautoland@d5df64b38425 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjonco
bugs1803810
milestone124.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1803810 - Part 7: Add NonSharedGlobalSyncModuleLoaderScope::sTlsActiveLoader to hold per-thread loader. r=jonco Differential Revision: https://phabricator.services.mozilla.com/D199459
js/xpconnect/loader/mozJSModuleLoader.cpp
js/xpconnect/loader/mozJSModuleLoader.h
--- a/js/xpconnect/loader/mozJSModuleLoader.cpp
+++ b/js/xpconnect/loader/mozJSModuleLoader.cpp
@@ -445,16 +445,17 @@ void mozJSModuleLoader::FindTargetObject
     }
   }
 }
 
 void mozJSModuleLoader::InitStatics() {
   MOZ_ASSERT(!sSelf);
   sSelf = new mozJSModuleLoader();
   RegisterWeakMemoryReporter(sSelf);
+  NonSharedGlobalSyncModuleLoaderScope::InitStatics();
 }
 
 void mozJSModuleLoader::UnloadLoaders() {
   if (sSelf) {
     sSelf->Unload();
   }
   if (sDevToolsLoader) {
     sDevToolsLoader->Unload();
@@ -1956,63 +1957,67 @@ size_t mozJSModuleLoader::ModuleEntry::S
   n += aMallocSizeOf(location);
 
   return n;
 }
 
 //----------------------------------------------------------------------
 
 /* static */
-mozJSModuleLoader* NonSharedGlobalSyncModuleLoaderScope::sActiveLoader =
-    nullptr;
+MOZ_THREAD_LOCAL(mozJSModuleLoader*)
+NonSharedGlobalSyncModuleLoaderScope::sTlsActiveLoader;
+
+void NonSharedGlobalSyncModuleLoaderScope::InitStatics() {
+  sTlsActiveLoader.infallibleInit();
+}
 
 NonSharedGlobalSyncModuleLoaderScope::NonSharedGlobalSyncModuleLoaderScope(
     JSContext* aCx, nsIGlobalObject* aGlobal) {
-  // Only the main thread is supported for now.
-  MOZ_ASSERT(NS_IsMainThread());
-  MOZ_ASSERT(!mozJSModuleLoader::IsSharedSystemGlobal(aGlobal));
-  MOZ_ASSERT(!mozJSModuleLoader::IsDevToolsLoaderGlobal(aGlobal));
+  MOZ_ASSERT_IF(NS_IsMainThread(),
+                !mozJSModuleLoader::IsSharedSystemGlobal(aGlobal));
+  MOZ_ASSERT_IF(NS_IsMainThread(),
+                !mozJSModuleLoader::IsDevToolsLoaderGlobal(aGlobal));
 
   mAsyncModuleLoader = aGlobal->GetModuleLoader(aCx);
   MOZ_ASSERT(mAsyncModuleLoader,
              "The consumer should guarantee the global returns non-null module "
              "loader");
 
   mLoader = new mozJSModuleLoader();
   RegisterWeakMemoryReporter(mLoader);
   mLoader->InitSyncModuleLoaderForGlobal(aGlobal);
 
   mAsyncModuleLoader->CopyModulesTo(mLoader->mModuleLoader);
 
   mMaybeOverride.emplace(mAsyncModuleLoader, mLoader->mModuleLoader);
 
-  MOZ_ASSERT(!sActiveLoader);
-  sActiveLoader = mLoader;
+  MOZ_ASSERT(!sTlsActiveLoader.get());
+  sTlsActiveLoader.set(mLoader);
 }
 
 NonSharedGlobalSyncModuleLoaderScope::~NonSharedGlobalSyncModuleLoaderScope() {
-  MOZ_ASSERT(sActiveLoader == mLoader);
-  sActiveLoader = nullptr;
+  MOZ_ASSERT(sTlsActiveLoader.get() == mLoader);
+  sTlsActiveLoader.set(nullptr);
 
   mLoader->DisconnectSyncModuleLoaderFromGlobal();
   UnregisterWeakMemoryReporter(mLoader);
 }
 
 void NonSharedGlobalSyncModuleLoaderScope::Finish() {
   mLoader->mModuleLoader->MoveModulesTo(mAsyncModuleLoader);
 }
 
 /* static */
 bool NonSharedGlobalSyncModuleLoaderScope::IsActive() {
-  return !!sActiveLoader;
+  return !!sTlsActiveLoader.get();
 }
 
-/* static */
+/*static */
 mozJSModuleLoader* NonSharedGlobalSyncModuleLoaderScope::ActiveLoader() {
-  return sActiveLoader;
+  return sTlsActiveLoader.get();
 }
 
 //----------------------------------------------------------------------
 
 JSCLContextHelper::JSCLContextHelper(JSContext* aCx)
     : mContext(aCx), mBuf(nullptr) {}
 
 JSCLContextHelper::~JSCLContextHelper() {
--- a/js/xpconnect/loader/mozJSModuleLoader.h
+++ b/js/xpconnect/loader/mozJSModuleLoader.h
@@ -10,16 +10,17 @@
 #include "SyncModuleLoader.h"
 #include "mozilla/Attributes.h"  // MOZ_STACK_CLASS
 #include "mozilla/dom/ScriptSettings.h"
 #include "mozilla/FileLocation.h"
 #include "mozilla/Maybe.h"  // mozilla::Maybe
 #include "mozilla/MemoryReporting.h"
 #include "mozilla/RefPtr.h"  // RefPtr, mozilla::StaticRefPtr
 #include "mozilla/StaticPtr.h"
+#include "mozilla/ThreadLocal.h"  // MOZ_THREAD_LOCAL
 #include "nsIMemoryReporter.h"
 #include "nsISupports.h"
 #include "nsIURI.h"
 #include "nsClassHashtable.h"
 #include "jsapi.h"
 #include "js/experimental/JSStencil.h"
 #include "SkipCheckForBrokenURLOrZeroSized.h"
 
@@ -310,23 +311,25 @@ class MOZ_STACK_CLASS NonSharedGlobalSyn
   void Finish();
 
   // Returns true if another instance of NonSharedGlobalSyncModuleLoaderScope
   // is on stack.
   static bool IsActive();
 
   static mozJSModuleLoader* ActiveLoader();
 
+  static void InitStatics();
+
  private:
   RefPtr<mozJSModuleLoader> mLoader;
 
-  // The module loader on the stack.
+  // Reference to thread-local module loader on the stack.
   // This is used by another sync module load during a sync module load is
   // ongoing.
-  static mozJSModuleLoader* sActiveLoader;
+  static MOZ_THREAD_LOCAL(mozJSModuleLoader*) sTlsActiveLoader;
 
   // The module loader of the target global.
   RefPtr<JS::loader::ModuleLoaderBase> mAsyncModuleLoader;
 
   mozilla::Maybe<JS::loader::AutoOverrideModuleLoader> mMaybeOverride;
 };
 
 }  // namespace mozilla::loader