[WTF] Add makeUnique<T>, which ensures T is fast-allocated, makeUnique / makeUniqueWi...
[WebKit-https.git] / Source / WebCore / platform / ThreadGlobalData.cpp
index 737867d..27a7364 100644 (file)
 #include <wtf/Threading.h>
 #include <wtf/text/StringImpl.h>
 
-#if PLATFORM(MAC)
-#include "TextCodecMac.h"
-#endif
-
 namespace WebCore {
 
 ThreadGlobalData::ThreadGlobalData()
-    : m_cachedResourceRequestInitiators(std::make_unique<CachedResourceRequestInitiators>())
+    : m_cachedResourceRequestInitiators(makeUnique<CachedResourceRequestInitiators>())
     , m_eventNames(EventNames::create())
-    , m_threadTimers(std::make_unique<ThreadTimers>())
-    , m_qualifiedNameCache(std::make_unique<QualifiedNameCache>())
+    , m_threadTimers(makeUnique<ThreadTimers>())
+    , m_qualifiedNameCache(makeUnique<QualifiedNameCache>())
 #ifndef NDEBUG
     , m_isMainThread(isMainThread())
 #endif
-    , m_cachedConverterICU(std::make_unique<ICUConverterWrapper>())
-#if PLATFORM(MAC)
-    , m_cachedConverterTEC(std::make_unique<TECConverterWrapper>())
-#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
@@ -63,16 +56,10 @@ ThreadGlobalData::ThreadGlobalData()
     Thread::current();
 }
 
-ThreadGlobalData::~ThreadGlobalData()
-{
-}
+ThreadGlobalData::~ThreadGlobalData() = default;
 
 void ThreadGlobalData::destroy()
 {
-#if PLATFORM(MAC)
-    m_cachedConverterTEC = nullptr;
-#endif
-
     m_cachedConverterICU = nullptr;
 
     m_eventNames = nullptr;
@@ -81,7 +68,7 @@ void ThreadGlobalData::destroy()
 }
 
 #if USE(WEB_THREAD)
-static ThreadSpecific<std::unique_ptr<ThreadGlobalData>>* staticData { nullptr };
+static ThreadSpecific<RefPtr<ThreadGlobalData>>* staticData { nullptr };
 static ThreadGlobalData* sharedMainThreadStaticData { nullptr };
 
 void ThreadGlobalData::setWebCoreThreadData()
@@ -90,11 +77,7 @@ void ThreadGlobalData::setWebCoreThreadData()
     ASSERT(&threadGlobalData() != sharedMainThreadStaticData);
 
     // Set WebThread's ThreadGlobalData object to be the same as the main UI thread.
-    // The web thread never finishes, and we expect the main thread to also never finish.
-    // Hence, it is safe to store the same ThreadGlobalData pointer in a thread specific std::unique_ptr.
-    // FIXME: Make ThreadGlobalData RefCounted for web thread.
-    // https://bugs.webkit.org/show_bug.cgi?id=175439
-    (**staticData).reset(sharedMainThreadStaticData);
+    **staticData = adoptRef(sharedMainThreadStaticData);
 
     ASSERT(&threadGlobalData() == sharedMainThreadStaticData);
 }
@@ -102,20 +85,22 @@ void ThreadGlobalData::setWebCoreThreadData()
 ThreadGlobalData& threadGlobalData()
 {
     if (UNLIKELY(!staticData)) {
-        staticData = new ThreadSpecific<std::unique_ptr<ThreadGlobalData>>;
+        staticData = new ThreadSpecific<RefPtr<ThreadGlobalData>>;
         auto& result = **staticData;
         ASSERT(!result);
-        result.reset(new ThreadGlobalData());
+        result = adoptRef(new ThreadGlobalData);
         // WebThread and main UI thread need to share the same object. Save it in a static
         // here, the WebThread will pick it up in setWebCoreThreadData().
-        if (pthread_main_np())
+        if (pthread_main_np()) {
             sharedMainThreadStaticData = result.get();
+            result->ref();
+        }
         return *result;
     }
 
     auto& result = **staticData;
     if (!result)
-        result.reset(new ThreadGlobalData());
+        result = adoptRef(new ThreadGlobalData);
     return *result;
 }