2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #ifndef WTFThreadData_h
28 #define WTFThreadData_h
30 #include <wtf/HashMap.h>
31 #include <wtf/HashSet.h>
32 #include <wtf/Noncopyable.h>
33 #include <wtf/text/StringHash.h>
35 // This was ENABLE(WORKERS) in WebCore, but this is not defined when compiling JSC.
36 // However this check was not correct anyway, re this comment:
37 // // FIXME: Workers are not necessarily the only feature that make per-thread global data necessary.
38 // // We need to check for e.g. database objects manipulating strings on secondary threads.
39 // Always enabling this is safe, and should be a better option until we can come up
40 // with a better define.
41 #define WTFTHREADDATA_MULTITHREADED 1
43 #if WTFTHREADDATA_MULTITHREADED
44 #include <wtf/ThreadSpecific.h>
45 #include <wtf/Threading.h>
48 // FIXME: This is a temporary layering violation while we move more string code to WTF.
50 class AtomicStringTable
;
53 using WebCore::StringImpl
;
55 typedef void (*AtomicStringTableDestructor
)(WebCore::AtomicStringTable
*);
58 // FIXME: This is a temporary layering violation while we move more string code to WTF.
61 typedef HashMap
<const char*, RefPtr
<StringImpl
>, PtrHash
<const char*> > LiteralIdentifierTable
;
63 class IdentifierTable
: public FastAllocBase
{
67 std::pair
<HashSet
<StringImpl
*>::iterator
, bool> add(StringImpl
* value
);
68 template<typename U
, typename V
>
69 std::pair
<HashSet
<StringImpl
*>::iterator
, bool> add(U value
);
71 void remove(StringImpl
* r
) { m_table
.remove(r
); }
73 LiteralIdentifierTable
& literalTable() { return m_literalTable
; }
76 HashSet
<StringImpl
*> m_table
;
77 LiteralIdentifierTable m_literalTable
;
85 class WTFThreadData
: public Noncopyable
{
90 WebCore::AtomicStringTable
* atomicStringTable()
92 return m_atomicStringTable
;
97 JSC::IdentifierTable
* currentIdentifierTable()
99 return m_currentIdentifierTable
;
102 JSC::IdentifierTable
* setCurrentIdentifierTable(JSC::IdentifierTable
* identifierTable
)
104 JSC::IdentifierTable
* oldIdentifierTable
= m_currentIdentifierTable
;
105 m_currentIdentifierTable
= identifierTable
;
106 return oldIdentifierTable
;
109 void resetCurrentIdentifierTable()
111 m_currentIdentifierTable
= m_defaultIdentifierTable
;
116 WebCore::AtomicStringTable
* m_atomicStringTable
;
117 AtomicStringTableDestructor m_atomicStringTableDestructor
;
120 JSC::IdentifierTable
* m_defaultIdentifierTable
;
121 JSC::IdentifierTable
* m_currentIdentifierTable
;
124 #if WTFTHREADDATA_MULTITHREADED
125 static JS_EXPORTDATA ThreadSpecific
<WTFThreadData
>* staticData
;
127 static JS_EXPORTDATA WTFThreadData
* staticData
;
129 friend WTFThreadData
& wtfThreadData();
130 friend class WebCore::AtomicStringTable
;
133 inline WTFThreadData
& wtfThreadData()
135 #if WTFTHREADDATA_MULTITHREADED
137 // WTFThreadData is used on main thread before it could possibly be used
138 // on secondary ones, so there is no need for synchronization here.
139 // WRT JavaScriptCore:
140 // wtfThreadData() is initially called from initializeThreading(), ensuring
141 // this is initially called in a pthread_once locked context.
142 if (!WTFThreadData::staticData
)
143 WTFThreadData::staticData
= new ThreadSpecific
<WTFThreadData
>;
144 return **WTFThreadData::staticData
;
146 if (!WTFThreadData::staticData
) {
147 WTFThreadData::staticData
= static_cast<WTFThreadData
*>(fastMalloc(sizeof(WTFThreadData
)));
148 // WTFThreadData constructor indirectly uses staticData, so we need to set up the memory before invoking it.
149 new (WTFThreadData::staticData
) WTFThreadData
;
151 return *WTFThreadData::staticData
;
157 using WTF::WTFThreadData
;
158 using WTF::wtfThreadData
;
160 #endif // WTFThreadData_h