source: webkit/trunk/JavaScriptCore/wtf/WTFThreadData.h@ 58306

Last change on this file since 58306 was 58114, checked in by [email protected], 15 years ago

https://bugs.webkit.org/show_bug.cgi?id=37978
Unify JSC::IdentifierTable and WebCore::AtomicStringTable implementations.

Reviewed by Geoff Garen.

These two classes both implement a HashSet of uniqued StringImpls, with
translator classes to avoid unnecessary object creation. The only difference
between the classes is which flag (isIdentifier or inTable) is set.
Combine the two classes using a template predicated on which flag to use.

New class AtomicStringTable created, containing all the goodness from
IdentifierTable & AtomicStringTable, expect for Identifier's literalTable,
which has been moved onto JSGlobalData. Removed duplicate string translator
classes. Renamed StringImpl's inTable flag to more explicit 'isAtomic',
and set this on the empty string (which matches Identifier behaviour, and
removes a redundant check for zero-length).

(JSC::createLiteralTable):
(JSC::deleteLiteralTable):
(JSC::Identifier::add):
(JSC::Identifier::addSlowCase):

  • runtime/Identifier.h:
  • runtime/JSGlobalData.cpp:

(JSC::JSGlobalData::JSGlobalData):
(JSC::JSGlobalData::~JSGlobalData):

  • runtime/JSGlobalData.h:
  • wtf/WTFThreadData.cpp:

(WTF::WTFThreadData::WTFThreadData):
(WTF::WTFThreadData::~WTFThreadData):

  • wtf/WTFThreadData.h:

(WTF::WTFThreadData::atomicStringTable):

  • wtf/text/AtomicString.cpp:

(WebCore::table):
(WebCore::operator==):
(WebCore::AtomicString::add):
(WebCore::AtomicString::find):
(WebCore::AtomicString::remove):

  • wtf/text/AtomicStringTable.h: Added.

(WTF::CStringTranslator::hash):
(WTF::CStringTranslator::equal):
(WTF::CStringTranslator::translate):
(WTF::UCharBufferTranslator::hash):
(WTF::UCharBufferTranslator::equal):
(WTF::UCharBufferTranslator::translate):
(WTF::HashAndCharactersTranslator::hash):
(WTF::HashAndCharactersTranslator::equal):
(WTF::HashAndCharactersTranslator::translate):
(WTF::IdentifierOrAtomicStringTable::remove):
(WTF::::~IdentifierOrAtomicStringTable):
(WTF::::add):
(WTF::::find):

  • wtf/text/StringImpl.cpp:

(WebCore::StringImpl::~StringImpl):

  • wtf/text/StringImpl.h:

(WebCore::StringImpl::isAtomic):
(WebCore::StringImpl::setIsAtomic):
(WebCore::equal):

  • wtf/text/StringImplBase.h:

(WTF::StringImplBase::StringImplBase):

  • Property svn:eol-style set to native
File size: 4.5 KB
Line 
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#ifndef WTFThreadData_h
28#define WTFThreadData_h
29
30#include <wtf/Noncopyable.h>
31
32// This was ENABLE(WORKERS) in WebCore, but this is not defined when compiling JSC.
33// However this check was not correct anyway, re this comment:
34// // FIXME: Workers are not necessarily the only feature that make per-thread global data necessary.
35// // We need to check for e.g. database objects manipulating strings on secondary threads.
36// Always enabling this is safe, and should be a better option until we can come up
37// with a better define.
38#define WTFTHREADDATA_MULTITHREADED 1
39
40#if WTFTHREADDATA_MULTITHREADED
41#include <wtf/ThreadSpecific.h>
42#include <wtf/Threading.h>
43#endif
44
45// FIXME: This is a temporary layering violation while we move more string code to WTF.
46namespace JSC {
47class IdentifierTable;
48}
49
50// FIXME: This is a temporary layering violation while we move more string code to WTF.
51namespace WebCore {
52class AtomicStringTable;
53}
54
55namespace WTF {
56
57class WTFThreadData : public Noncopyable {
58public:
59 WTFThreadData();
60 ~WTFThreadData();
61
62 WebCore::AtomicStringTable& atomicStringTable()
63 {
64 return *m_atomicStringTable;
65 }
66
67#if USE(JSC)
68 void initializeIdentifierTable(JSC::IdentifierTable* identifierTable)
69 {
70 m_defaultIdentifierTable = identifierTable;
71 m_currentIdentifierTable = identifierTable;
72 }
73
74 JSC::IdentifierTable* currentIdentifierTable()
75 {
76 return m_currentIdentifierTable;
77 }
78
79 JSC::IdentifierTable* setCurrentIdentifierTable(JSC::IdentifierTable* identifierTable)
80 {
81 JSC::IdentifierTable* oldIdentifierTable = m_currentIdentifierTable;
82 m_currentIdentifierTable = identifierTable;
83 return oldIdentifierTable;
84 }
85
86 void resetCurrentIdentifierTable()
87 {
88 m_currentIdentifierTable = m_defaultIdentifierTable;
89 }
90#endif
91
92private:
93 WebCore::AtomicStringTable* m_atomicStringTable;
94
95#if USE(JSC)
96 JSC::IdentifierTable* m_defaultIdentifierTable;
97 JSC::IdentifierTable* m_currentIdentifierTable;
98#endif
99
100#if WTFTHREADDATA_MULTITHREADED
101 static JS_EXPORTDATA ThreadSpecific<WTFThreadData>* staticData;
102#else
103 static JS_EXPORTDATA WTFThreadData* staticData;
104#endif
105 friend WTFThreadData& wtfThreadData();
106};
107
108inline WTFThreadData& wtfThreadData()
109{
110#if WTFTHREADDATA_MULTITHREADED
111 // WRT WebCore:
112 // WTFThreadData is used on main thread before it could possibly be used
113 // on secondary ones, so there is no need for synchronization here.
114 // WRT JavaScriptCore:
115 // wtfThreadData() is initially called from initializeThreading(), ensuring
116 // this is initially called in a pthread_once locked context.
117 if (!WTFThreadData::staticData)
118 WTFThreadData::staticData = new ThreadSpecific<WTFThreadData>;
119 return **WTFThreadData::staticData;
120#else
121 if (!WTFThreadData::staticData) {
122 WTFThreadData::staticData = static_cast<WTFThreadData*>(fastMalloc(sizeof(WTFThreadData)));
123 // WTFThreadData constructor indirectly uses staticData, so we need to set up the memory before invoking it.
124 new (WTFThreadData::staticData) WTFThreadData;
125 }
126 return *WTFThreadData::staticData;
127#endif
128}
129
130} // namespace WTF
131
132using WTF::WTFThreadData;
133using WTF::wtfThreadData;
134
135#endif // WTFThreadData_h
Note: See TracBrowser for help on using the repository browser.