1/* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * 25 */ 26 27#include "config.h" 28#include "ThreadGlobalData.h" 29 30#include "EventNames.h" 31#include "StringImpl.h" 32#include "ThreadTimers.h" 33#include <wtf/UnusedParam.h> 34 35#if USE(ICU_UNICODE) 36#include "TextCodecICU.h" 37#endif 38 39#if PLATFORM(MAC) 40#include "TextCodecMac.h" 41#endif 42 43#if ENABLE(WORKERS) 44#include <wtf/Threading.h> 45#include <wtf/ThreadSpecific.h> 46using namespace WTF; 47#endif 48 49namespace WebCore { 50 51#if ENABLE(WORKERS) 52ThreadSpecific<ThreadGlobalData>* ThreadGlobalData::staticData; 53#else 54ThreadGlobalData* ThreadGlobalData::staticData; 55#endif 56 57ThreadGlobalData::ThreadGlobalData() 58 : m_emptyString(new StringImpl) 59 , m_atomicStringTable(new HashSet<StringImpl*>) 60 , m_eventNames(new EventNames) 61 , m_threadTimers(new ThreadTimers) 62#ifndef NDEBUG 63 , m_isMainThread(isMainThread()) 64#endif 65#if USE(ICU_UNICODE) 66 , m_cachedConverterICU(new ICUConverterWrapper) 67#endif 68#if PLATFORM(MAC) 69 , m_cachedConverterTEC(new TECConverterWrapper) 70#endif 71{ 72} 73 74ThreadGlobalData::~ThreadGlobalData() 75{ 76#if PLATFORM(MAC) 77 delete m_cachedConverterTEC; 78#endif 79#if USE(ICU_UNICODE) 80 delete m_cachedConverterICU; 81#endif 82 delete m_eventNames; 83 delete m_atomicStringTable; 84 delete m_threadTimers; 85 86 // Using member variable m_isMainThread instead of calling WTF::isMainThread() directly 87 // to avoid issues described in https://bugs.webkit.org/show_bug.cgi?id=25973. 88 // In short, some pthread-based platforms and ports can not use WTF::CurrentThread() and WTF::isMainThread() 89 // in destructors of thread-specific data. 90 ASSERT(m_isMainThread || m_emptyString->hasOneRef()); // We intentionally don't clean up static data on application quit, so there will be many strings remaining on the main thread. 91 92 delete m_emptyString; 93} 94 95} // namespace WebCore 96