Title: [274705] trunk/Source/WebCore
Revision
274705
Author
[email protected]
Date
2021-03-19 00:54:41 -0700 (Fri, 19 Mar 2021)

Log Message

WebCore::ThreadGlobalData should not initialize fields eagerly
https://bugs.webkit.org/show_bug.cgi?id=223481

Reviewed by Chris Dumez.

ThreadGlobalData is used in various cases. For example, WebCore::Timer uses it, and
this is even also used in GPUProcess. We observed something (e.g. EventNames, QualifiedNameCache etc.)
is initialized even in GPUProcess just because GPUProcess's audio stack uses WebCore::Timer.

This patch makes these fields lazily-allocated to avoid initializing eagerly in the threads that
are not interested in DOM etc.

* platform/ThreadGlobalData.cpp:
(WebCore::ThreadGlobalData::ThreadGlobalData):
(WebCore::ThreadGlobalData::initializeCachedResourceRequestInitiators):
(WebCore::ThreadGlobalData::initializeEventNames):
(WebCore::ThreadGlobalData::initializeQualifiedNameCache):
(WebCore::ThreadGlobalData::initializeMimeTypeRegistryThreadGlobalData):
(WebCore::ThreadGlobalData::mimeTypeRegistryThreadGlobalData): Deleted.
* platform/ThreadGlobalData.h:
(WebCore::ThreadGlobalData::ThreadGlobalData::cachedResourceRequestInitiators):
(WebCore::ThreadGlobalData::ThreadGlobalData::eventNames):
(WebCore::ThreadGlobalData::ThreadGlobalData::qualifiedNameCache):
(WebCore::ThreadGlobalData::ThreadGlobalData::mimeTypeRegistryThreadGlobalData):
(WebCore::ThreadGlobalData::ThreadGlobalData::threadTimers):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (274704 => 274705)


--- trunk/Source/WebCore/ChangeLog	2021-03-19 05:30:06 UTC (rev 274704)
+++ trunk/Source/WebCore/ChangeLog	2021-03-19 07:54:41 UTC (rev 274705)
@@ -1,3 +1,31 @@
+2021-03-19  Yusuke Suzuki  <[email protected]>
+
+        WebCore::ThreadGlobalData should not initialize fields eagerly
+        https://bugs.webkit.org/show_bug.cgi?id=223481
+
+        Reviewed by Chris Dumez.
+
+        ThreadGlobalData is used in various cases. For example, WebCore::Timer uses it, and
+        this is even also used in GPUProcess. We observed something (e.g. EventNames, QualifiedNameCache etc.)
+        is initialized even in GPUProcess just because GPUProcess's audio stack uses WebCore::Timer.
+
+        This patch makes these fields lazily-allocated to avoid initializing eagerly in the threads that
+        are not interested in DOM etc.
+
+        * platform/ThreadGlobalData.cpp:
+        (WebCore::ThreadGlobalData::ThreadGlobalData):
+        (WebCore::ThreadGlobalData::initializeCachedResourceRequestInitiators):
+        (WebCore::ThreadGlobalData::initializeEventNames):
+        (WebCore::ThreadGlobalData::initializeQualifiedNameCache):
+        (WebCore::ThreadGlobalData::initializeMimeTypeRegistryThreadGlobalData):
+        (WebCore::ThreadGlobalData::mimeTypeRegistryThreadGlobalData): Deleted.
+        * platform/ThreadGlobalData.h:
+        (WebCore::ThreadGlobalData::ThreadGlobalData::cachedResourceRequestInitiators):
+        (WebCore::ThreadGlobalData::ThreadGlobalData::eventNames):
+        (WebCore::ThreadGlobalData::ThreadGlobalData::qualifiedNameCache):
+        (WebCore::ThreadGlobalData::ThreadGlobalData::mimeTypeRegistryThreadGlobalData):
+        (WebCore::ThreadGlobalData::ThreadGlobalData::threadTimers):
+
 2021-03-18  Simon Fraser  <[email protected]>
 
         Attempt to fix the macOS build after r274695.

Modified: trunk/Source/WebCore/platform/ThreadGlobalData.cpp (274704 => 274705)


--- trunk/Source/WebCore/platform/ThreadGlobalData.cpp	2021-03-19 05:30:06 UTC (rev 274704)
+++ trunk/Source/WebCore/platform/ThreadGlobalData.cpp	2021-03-19 07:54:41 UTC (rev 274705)
@@ -41,14 +41,11 @@
 namespace WebCore {
 
 ThreadGlobalData::ThreadGlobalData()
-    : m_cachedResourceRequestInitiators(makeUnique<CachedResourceRequestInitiators>())
-    , m_eventNames(EventNames::create())
-    , m_threadTimers(makeUnique<ThreadTimers>())
-    , m_qualifiedNameCache(makeUnique<QualifiedNameCache>())
+    : m_threadTimers(makeUnique<ThreadTimers>())
+    , m_cachedConverterICU(makeUnique<ICUConverterWrapper>())
 #ifndef NDEBUG
     , m_isMainThread(isMainThread())
 #endif
-    , m_cachedConverterICU(makeUnique<ICUConverterWrapper>())
 {
     // This constructor will have been called on the main thread before being called on
     // any other thread, and is only called once per thread - this makes this a convenient
@@ -118,11 +115,28 @@
 
 #endif
 
-const MIMETypeRegistryThreadGlobalData& ThreadGlobalData::mimeTypeRegistryThreadGlobalData()
+void ThreadGlobalData::initializeCachedResourceRequestInitiators()
 {
-    if (UNLIKELY(!m_MIMETypeRegistryThreadGlobalData))
-        m_MIMETypeRegistryThreadGlobalData = MIMETypeRegistry::createMIMETypeRegistryThreadGlobalData();
-    return *m_MIMETypeRegistryThreadGlobalData;
+    ASSERT(!m_cachedResourceRequestInitiators);
+    m_cachedResourceRequestInitiators = makeUnique<CachedResourceRequestInitiators>();
 }
 
+void ThreadGlobalData::initializeEventNames()
+{
+    ASSERT(!m_eventNames);
+    m_eventNames = EventNames::create();
+}
+
+void ThreadGlobalData::initializeQualifiedNameCache()
+{
+    ASSERT(!m_qualifiedNameCache);
+    m_qualifiedNameCache = makeUnique<QualifiedNameCache>();
+}
+
+void ThreadGlobalData::initializeMimeTypeRegistryThreadGlobalData()
+{
+    ASSERT(!m_MIMETypeRegistryThreadGlobalData);
+    m_MIMETypeRegistryThreadGlobalData = MIMETypeRegistry::createMIMETypeRegistryThreadGlobalData();
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/ThreadGlobalData.h (274704 => 274705)


--- trunk/Source/WebCore/platform/ThreadGlobalData.h	2021-03-19 05:30:06 UTC (rev 274704)
+++ trunk/Source/WebCore/platform/ThreadGlobalData.h	2021-03-19 07:54:41 UTC (rev 274705)
@@ -57,11 +57,32 @@
     WEBCORE_EXPORT ~ThreadGlobalData();
     void destroy(); // called on workers to clean up the ThreadGlobalData before the thread exits.
 
-    const CachedResourceRequestInitiators& cachedResourceRequestInitiators() { return *m_cachedResourceRequestInitiators; }
-    EventNames& eventNames() { return *m_eventNames; }
+    const CachedResourceRequestInitiators& cachedResourceRequestInitiators()
+    {
+        if (UNLIKELY(!m_cachedResourceRequestInitiators))
+            initializeCachedResourceRequestInitiators();
+        return *m_cachedResourceRequestInitiators;
+    }
+    EventNames& eventNames()
+    {
+        if (UNLIKELY(!m_eventNames))
+            initializeEventNames();
+        return *m_eventNames;
+    }
+    QualifiedNameCache& qualifiedNameCache()
+    {
+        if (UNLIKELY(!m_qualifiedNameCache))
+            initializeQualifiedNameCache();
+        return *m_qualifiedNameCache;
+    }
+    const MIMETypeRegistryThreadGlobalData& mimeTypeRegistryThreadGlobalData()
+    {
+        if (UNLIKELY(!m_MIMETypeRegistryThreadGlobalData))
+            initializeMimeTypeRegistryThreadGlobalData();
+        return *m_MIMETypeRegistryThreadGlobalData;
+    }
+
     ThreadTimers& threadTimers() { return *m_threadTimers; }
-    QualifiedNameCache& qualifiedNameCache() { return *m_qualifiedNameCache; }
-
     ICUConverterWrapper& cachedConverterICU() { return *m_cachedConverterICU; }
 
     JSC::JSGlobalObject* currentState() const { return m_currentState; }
@@ -74,14 +95,19 @@
     bool isInRemoveAllEventListeners() const { return m_isInRemoveAllEventListeners; }
     void setIsInRemoveAllEventListeners(bool value) { m_isInRemoveAllEventListeners = value; }
 
-    const MIMETypeRegistryThreadGlobalData& mimeTypeRegistryThreadGlobalData();
+private:
+    WEBCORE_EXPORT void initializeCachedResourceRequestInitiators();
+    WEBCORE_EXPORT void initializeEventNames();
+    WEBCORE_EXPORT void initializeQualifiedNameCache();
+    WEBCORE_EXPORT void initializeMimeTypeRegistryThreadGlobalData();
 
-private:
     std::unique_ptr<CachedResourceRequestInitiators> m_cachedResourceRequestInitiators;
     std::unique_ptr<EventNames> m_eventNames;
     std::unique_ptr<ThreadTimers> m_threadTimers;
     std::unique_ptr<QualifiedNameCache> m_qualifiedNameCache;
     JSC::JSGlobalObject* m_currentState { nullptr };
+    std::unique_ptr<ICUConverterWrapper> m_cachedConverterICU;
+    std::unique_ptr<MIMETypeRegistryThreadGlobalData> m_MIMETypeRegistryThreadGlobalData;
 
 #ifndef NDEBUG
     bool m_isMainThread;
@@ -89,9 +115,6 @@
 
     bool m_isInRemoveAllEventListeners { false };
 
-    std::unique_ptr<ICUConverterWrapper> m_cachedConverterICU;
-    std::unique_ptr<MIMETypeRegistryThreadGlobalData> m_MIMETypeRegistryThreadGlobalData;
-
     WEBCORE_EXPORT friend ThreadGlobalData& threadGlobalData();
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to