ThreadGlobalData.cpp [plain text]
#include "config.h"
#include "ThreadGlobalData.h"
#include "CachedResourceRequestInitiators.h"
#include "EventNames.h"
#include "QualifiedNameCache.h"
#include "TextCodecICU.h"
#include "ThreadTimers.h"
#include <wtf/MainThread.h>
#include <wtf/ThreadSpecific.h>
#include <wtf/Threading.h>
#include <wtf/text/StringImpl.h>
namespace WebCore {
ThreadGlobalData::ThreadGlobalData()
: m_cachedResourceRequestInitiators(std::make_unique<CachedResourceRequestInitiators>())
, m_eventNames(EventNames::create())
, m_threadTimers(std::make_unique<ThreadTimers>())
, m_qualifiedNameCache(std::make_unique<QualifiedNameCache>())
#ifndef NDEBUG
, m_isMainThread(isMainThread())
#endif
, m_cachedConverterICU(std::make_unique<ICUConverterWrapper>())
{
Thread::current();
}
ThreadGlobalData::~ThreadGlobalData() = default;
void ThreadGlobalData::destroy()
{
m_cachedConverterICU = nullptr;
m_eventNames = nullptr;
m_threadTimers = nullptr;
m_qualifiedNameCache = nullptr;
}
#if USE(WEB_THREAD)
static ThreadSpecific<RefPtr<ThreadGlobalData>>* staticData { nullptr };
static ThreadGlobalData* sharedMainThreadStaticData { nullptr };
void ThreadGlobalData::setWebCoreThreadData()
{
ASSERT(isWebThread());
ASSERT(&threadGlobalData() != sharedMainThreadStaticData);
**staticData = adoptRef(sharedMainThreadStaticData);
ASSERT(&threadGlobalData() == sharedMainThreadStaticData);
}
ThreadGlobalData& threadGlobalData()
{
if (UNLIKELY(!staticData)) {
staticData = new ThreadSpecific<RefPtr<ThreadGlobalData>>;
auto& result = **staticData;
ASSERT(!result);
result = adoptRef(new ThreadGlobalData);
if (pthread_main_np()) {
sharedMainThreadStaticData = result.get();
result->ref();
}
return *result;
}
auto& result = **staticData;
if (!result)
result = adoptRef(new ThreadGlobalData);
return *result;
}
#else
static ThreadSpecific<ThreadGlobalData>* staticData { nullptr };
ThreadGlobalData& threadGlobalData()
{
if (UNLIKELY(!staticData))
staticData = new ThreadSpecific<ThreadGlobalData>;
return **staticData;
}
#endif
}