Changeset 88357 in webkit
- Timestamp:
- Jun 8, 2011 10:31:03 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 deleted
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r88350 r88357 1 2011-06-08 Dmitry Lomov <dslomov@google.com> 2 3 Reviewed by Adam Barth. 4 5 https://bugs.webkit.org/show_bug.cgi?id=62164 6 Remove "multi-threaded" logic in V8 DOMData, DOMDataStore and friends 7 This functionality is untested and unused: 8 This is an old code from Lockers-based implementation of WebWorkers in 9 V8 bindings, to make sure that DOM objects are released on the right thread 10 even though GC could have happened on any thread. It is currently unused (since 11 current model is one worker per process) and is being removed because new implementation 12 of WebWorkers will be using V8 isolates. 13 14 * WebCore.gypi: 15 * WebCore.pro: 16 * bindings/v8/ChildThreadDOMData.cpp: Removed. 17 * bindings/v8/ChildThreadDOMData.h: Removed. 18 * bindings/v8/DOMData.cpp: 19 (WebCore::DOMData::DOMData): 20 (WebCore::DOMData::getCurrent): 21 (WebCore::DOMData::getMainThreadStore): 22 * bindings/v8/DOMData.h: 23 (WebCore::DOMData::getStore): 24 (WebCore::DOMData::getCurrentMainThreadStore): 25 (WebCore::DOMData::handleWeakObject): 26 * bindings/v8/DOMDataStore.cpp: 27 (WebCore::DOMDataStore::DOMDataStore): 28 (WebCore::DOMDataStore::~DOMDataStore): 29 (WebCore::DOMDataStore::weakNodeCallback): 30 * bindings/v8/DOMDataStore.h: 31 * bindings/v8/MainThreadDOMData.cpp: Removed. 32 * bindings/v8/MainThreadDOMData.h: Removed. 33 * bindings/v8/V8DOMMap.cpp: 34 (WebCore::getDOMDataStore): 35 (WebCore::removeAllDOMObjects): 36 (WebCore::visitDOMNodes): 37 (WebCore::visitDOMObjects): 38 (WebCore::visitActiveDOMObjects): 39 (WebCore::visitDOMSVGElementInstances): 40 * bindings/v8/V8DOMMap.h: 41 * bindings/v8/V8GCController.cpp: 42 (WebCore::V8GCController::gcPrologue): 43 (WebCore::V8GCController::gcEpilogue): 44 * bindings/v8/WorkerScriptController.cpp: 45 (WebCore::WorkerScriptController::~WorkerScriptController): 46 1 47 2011-06-08 Yael Aharon <yael.aharon@nokia.com> 2 48 -
trunk/Source/WebCore/WebCore.gypi
r88348 r88357 1954 1954 'bindings/objc/PublicDOMInterfaces.h', 1955 1955 'bindings/objc/WebScriptObject.mm', 1956 'bindings/v8/ChildThreadDOMData.cpp',1957 'bindings/v8/ChildThreadDOMData.h',1958 1956 'bindings/v8/DOMData.cpp', 1959 1957 'bindings/v8/DOMData.h', … … 1971 1969 'bindings/v8/JavaScriptCallFrame.cpp', 1972 1970 'bindings/v8/JavaScriptCallFrame.h', 1973 'bindings/v8/MainThreadDOMData.cpp',1974 'bindings/v8/MainThreadDOMData.h',1975 1971 'bindings/v8/NPV8Object.cpp', 1976 1972 'bindings/v8/NPV8Object.h', -
trunk/Source/WebCore/WebCore.pro
r88343 r88357 89 89 bindings/v8/custom/V8Uint32ArrayCustom.cpp \ 90 90 \ 91 bindings/v8/ChildThreadDOMData.cpp \92 91 bindings/v8/DateExtension.cpp \ 93 92 bindings/v8/DOMData.cpp \ 94 93 bindings/v8/DOMDataStore.cpp \ 95 bindings/v8/MainThreadDOMData.cpp \96 94 bindings/v8/NPV8Object.cpp \ 97 95 bindings/v8/PageScriptDebugServer.cpp \ -
trunk/Source/WebCore/bindings/v8/DOMData.cpp
r88273 r88357 31 31 #include "config.h" 32 32 #include "DOMData.h" 33 34 #include "ChildThreadDOMData.h" 35 #include "MainThreadDOMData.h" 33 #include "V8IsolatedContext.h" 36 34 #include "WebGLContextAttributes.h" 37 35 #include "WebGLUniformLocation.h" … … 40 38 41 39 DOMData::DOMData() 42 : m_ owningThread(WTF::currentThread())40 : m_defaultStore(this) 43 41 { 44 42 } … … 50 48 DOMData* DOMData::getCurrent() 51 49 { 52 if (WTF::isMainThread()) 53 return MainThreadDOMData::getCurrent(); 50 DEFINE_STATIC_LOCAL(DOMData, mainThreadDOMData, ()); 51 return &mainThreadDOMData; 52 } 54 53 55 DEFINE_STATIC_LOCAL(WTF::ThreadSpecific<ChildThreadDOMData>, childThreadDOMData, ()); 56 return childThreadDOMData; 54 DOMDataStore& DOMData::getMainThreadStore() 55 { 56 // This is broken out as a separate non-virtual method from getStore() 57 // so that it can be inlined by getCurrentMainThreadStore, which is 58 // a hot spot in Dromaeo DOM tests. 59 V8IsolatedContext* context = V8IsolatedContext::getEntered(); 60 if (UNLIKELY(context != 0)) 61 return *context->world()->domDataStore(); 62 return m_defaultStore; 57 63 } 58 64 … … 62 68 } 63 69 70 71 64 72 } // namespace WebCore -
trunk/Source/WebCore/bindings/v8/DOMData.h
r88273 r88357 33 33 34 34 #include "DOMDataStore.h" 35 #include "StaticDOMDataStore.h" 35 36 #include "V8DOMWrapper.h" 36 37 … … 51 52 52 53 static DOMData* getCurrent(); 53 virtual DOMDataStore& getStore() = 0;54 DOMDataStore& getStore() { return getMainThreadStore(); } 54 55 55 56 template<typename T> … … 59 60 static void removeObjectsFromWrapperMap(DOMDataStore* store, AbstractWeakReferenceMap<T, v8::Object>& domMap); 60 61 61 ThreadIdentifier owningThread() const { return m_owningThread; }62 static DOMDataStore& getCurrentMainThreadStore() { return getCurrent()->getMainThreadStore(); } 62 63 63 64 private: … … 75 76 }; 76 77 77 ThreadIdentifier m_owningThread; 78 DOMDataStore& getMainThreadStore(); 79 StaticDOMDataStore m_defaultStore; 78 80 }; 79 81 … … 86 88 for (size_t i = 0; i < list.size(); ++i) { 87 89 DOMDataStore* store = list[i]; 88 ASSERT(store->domData()->owningThread() == WTF::currentThread());89 90 90 91 DOMWrapperMap<T>* domMap = static_cast<DOMWrapperMap<T>*>(store->getDOMWrapperMap(mapType)); -
trunk/Source/WebCore/bindings/v8/DOMDataStore.cpp
r88273 r88357 92 92 , m_domData(domData) 93 93 { 94 WTF::MutexLocker locker(DOMDataStore::allStoresMutex());95 94 DOMDataStore::allStores().append(this); 96 95 } … … 98 97 DOMDataStore::~DOMDataStore() 99 98 { 100 WTF::MutexLocker locker(DOMDataStore::allStoresMutex());101 99 DOMDataStore::allStores().remove(DOMDataStore::allStores().find(this)); 102 100 } … … 106 104 DEFINE_STATIC_LOCAL(DOMDataList, staticDOMDataList, ()); 107 105 return staticDOMDataList; 108 }109 110 WTF::Mutex& DOMDataStore::allStoresMutex()111 {112 DEFINE_STATIC_LOCAL(WTF::Mutex, staticDOMDataListMutex, ());113 return staticDOMDataListMutex;114 106 } 115 107 … … 157 149 v8::Persistent<v8::Object> v8Object = v8::Persistent<v8::Object>::Cast(value); 158 150 159 WTF::MutexLocker locker(DOMDataStore::allStoresMutex());160 151 DOMDataList& list = DOMDataStore::allStores(); 161 152 for (size_t i = 0; i < list.size(); ++i) { 162 153 DOMDataStore* store = list[i]; 163 154 if (store->domNodeMap().removeIfPresent(node, v8Object)) { 164 ASSERT(store->domData()->owningThread() == WTF::currentThread());165 155 node->deref(); // Nobody overrides Node::deref so it's safe 166 156 return; // There might be at most one wrapper for the node in world's maps -
trunk/Source/WebCore/bindings/v8/DOMDataStore.h
r88273 r88357 78 78 // A list of all DOMDataStore objects in the current V8 instance (thread). Normally, each World has a DOMDataStore. 79 79 static DOMDataList& allStores(); 80 // Mutex to protect against concurrent access of DOMDataList.81 static WTF::Mutex& allStoresMutex();82 80 83 81 DOMData* domData() const { return m_domData; } -
trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp
r88273 r88357 34 34 #include "DOMData.h" 35 35 #include "DOMDataStore.h" 36 #include "MainThreadDOMData.h"37 36 #include "ScopedDOMDataStore.h" 38 37 … … 52 51 static inline DOMDataStore& getDOMDataStore() 53 52 { 54 if (LIKELY(fasterDOMStoreAccess)) { 55 ASSERT(WTF::isMainThread()); 56 return MainThreadDOMData::getCurrentMainThreadStore(); 57 } 58 59 return DOMData::getCurrent()->getStore(); 53 return DOMData::getCurrentMainThreadStore(); 60 54 } 61 55 … … 89 83 #endif // ENABLE(SVG) 90 84 91 void removeAllDOMObjects InCurrentThread()85 void removeAllDOMObjects() 92 86 { 93 87 DOMDataStore& store = getDOMDataStore(); … … 113 107 } 114 108 115 void visitDOMNodes InCurrentThread(DOMWrapperMap<Node>::Visitor* visitor)109 void visitDOMNodes(DOMWrapperMap<Node>::Visitor* visitor) 116 110 { 117 111 v8::HandleScope scope; 118 112 119 WTF::MutexLocker locker(DOMDataStore::allStoresMutex());120 113 DOMDataList& list = DOMDataStore::allStores(); 121 114 for (size_t i = 0; i < list.size(); ++i) { 122 115 DOMDataStore* store = list[i]; 123 if (!store->domData()->owningThread() == WTF::currentThread())124 continue;125 116 126 117 store->domNodeMap().visit(store, visitor); … … 128 119 } 129 120 130 void visitDOMObjects InCurrentThread(DOMWrapperMap<void>::Visitor* visitor)121 void visitDOMObjects(DOMWrapperMap<void>::Visitor* visitor) 131 122 { 132 123 v8::HandleScope scope; 133 124 134 WTF::MutexLocker locker(DOMDataStore::allStoresMutex());135 125 DOMDataList& list = DOMDataStore::allStores(); 136 126 for (size_t i = 0; i < list.size(); ++i) { 137 127 DOMDataStore* store = list[i]; 138 if (!store->domData()->owningThread() == WTF::currentThread())139 continue;140 128 141 129 store->domObjectMap().visit(store, visitor); … … 143 131 } 144 132 145 void visitActiveDOMObjects InCurrentThread(DOMWrapperMap<void>::Visitor* visitor)133 void visitActiveDOMObjects(DOMWrapperMap<void>::Visitor* visitor) 146 134 { 147 135 v8::HandleScope scope; 148 136 149 WTF::MutexLocker locker(DOMDataStore::allStoresMutex());150 137 DOMDataList& list = DOMDataStore::allStores(); 151 138 for (size_t i = 0; i < list.size(); ++i) { 152 139 DOMDataStore* store = list[i]; 153 if (!store->domData()->owningThread() == WTF::currentThread())154 continue;155 140 156 141 store->activeDomObjectMap().visit(store, visitor); … … 160 145 #if ENABLE(SVG) 161 146 162 void visitDOMSVGElementInstances InCurrentThread(DOMWrapperMap<SVGElementInstance>::Visitor* visitor)147 void visitDOMSVGElementInstances(DOMWrapperMap<SVGElementInstance>::Visitor* visitor) 163 148 { 164 149 v8::HandleScope scope; 165 150 166 WTF::MutexLocker locker(DOMDataStore::allStoresMutex());167 151 DOMDataList& list = DOMDataStore::allStores(); 168 152 for (size_t i = 0; i < list.size(); ++i) { 169 153 DOMDataStore* store = list[i]; 170 if (!store->domData()->owningThread() == WTF::currentThread())171 continue;172 154 173 155 store->domSvgElementInstanceMap().visit(store, visitor); -
trunk/Source/WebCore/bindings/v8/V8DOMMap.h
r88273 r88357 159 159 // A map from DOM node to its JS wrapper. 160 160 DOMNodeMapping& getDOMNodeMap(); 161 void visitDOMNodes InCurrentThread(DOMWrapperMap<Node>::Visitor*);161 void visitDOMNodes(DOMWrapperMap<Node>::Visitor*); 162 162 163 163 // A map from a DOM object (non-node) to its JS wrapper. This map does not contain the DOM objects which can have pending activity (active dom objects). 164 164 DOMWrapperMap<void>& getDOMObjectMap(); 165 void visitDOMObjects InCurrentThread(DOMWrapperMap<void>::Visitor*);165 void visitDOMObjects(DOMWrapperMap<void>::Visitor*); 166 166 167 167 // A map from a DOM object to its JS wrapper for DOM objects which can have pending activity. 168 168 DOMWrapperMap<void>& getActiveDOMObjectMap(); 169 void visitActiveDOMObjects InCurrentThread(DOMWrapperMap<void>::Visitor*);169 void visitActiveDOMObjects(DOMWrapperMap<void>::Visitor*); 170 170 171 171 // This should be called to remove all DOM objects associated with the current thread when it is tearing down. 172 void removeAllDOMObjects InCurrentThread();172 void removeAllDOMObjects(); 173 173 174 174 #if ENABLE(SVG) 175 175 // A map for SVGElementInstances to its JS wrapper. 176 176 DOMWrapperMap<SVGElementInstance>& getDOMSVGElementInstanceMap(); 177 void visitSVGElementInstances InCurrentThread(DOMWrapperMap<SVGElementInstance>::Visitor*);177 void visitSVGElementInstances(DOMWrapperMap<SVGElementInstance>::Visitor*); 178 178 #endif 179 179 -
trunk/Source/WebCore/bindings/v8/V8GCController.cpp
r88273 r88357 453 453 #ifndef NDEBUG 454 454 DOMObjectVisitor domObjectVisitor; 455 visitDOMObjects InCurrentThread(&domObjectVisitor);455 visitDOMObjects(&domObjectVisitor); 456 456 #endif 457 457 … … 459 459 // wrappers non weak if there is pending activity. 460 460 GCPrologueVisitor prologueVisitor; 461 visitActiveDOMObjects InCurrentThread(&prologueVisitor);461 visitActiveDOMObjects(&prologueVisitor); 462 462 463 463 // Create object groups. 464 464 GrouperVisitor grouperVisitor; 465 visitDOMNodes InCurrentThread(&grouperVisitor);466 visitDOMObjects InCurrentThread(&grouperVisitor);465 visitDOMNodes(&grouperVisitor); 466 visitDOMObjects(&grouperVisitor); 467 467 grouperVisitor.applyGrouping(); 468 468 … … 530 530 // again. 531 531 GCEpilogueVisitor epilogueVisitor; 532 visitActiveDOMObjects InCurrentThread(&epilogueVisitor);532 visitActiveDOMObjects(&epilogueVisitor); 533 533 534 534 workingSetEstimateMB = getActualMemoryUsageInMB(); … … 537 537 // Check all survivals are weak. 538 538 DOMObjectVisitor domObjectVisitor; 539 visitDOMObjects InCurrentThread(&domObjectVisitor);539 visitDOMObjects(&domObjectVisitor); 540 540 541 541 EnsureWeakDOMNodeVisitor weakDOMNodeVisitor; 542 visitDOMNodes InCurrentThread(&weakDOMNodeVisitor);542 visitDOMNodes(&weakDOMNodeVisitor); 543 543 544 544 enumerateGlobalHandles(); -
trunk/Source/WebCore/bindings/v8/WorkerScriptController.cpp
r88273 r88357 59 59 WorkerScriptController::~WorkerScriptController() 60 60 { 61 removeAllDOMObjects InCurrentThread();61 removeAllDOMObjects(); 62 62 } 63 63
Note: See TracChangeset
for help on using the changeset viewer.