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