2010-02-04 Stephen White <senorblanco@chromium.org>

        Unreviewed, build fix for Chromium.

        Revert r54341 ("[v8] Remove clear method from DOM object maps"),
        since it causes the worker tests to fail on Chromium.

        * bindings/v8/DOMData.h:
        (WebCore::DOMData::removeObjectsFromWrapperMap):
        * bindings/v8/DOMDataStore.h:
        (WebCore::ChunkedTable::clear):
        (WebCore::ChunkedTable::clearEntries):
        (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::clear):
        (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
        * bindings/v8/V8DOMMap.cpp:
        (WebCore::removeAllDOMObjectsInCurrentThreadHelper):
        (WebCore::removeAllDOMObjectsInCurrentThread):
        * bindings/v8/V8DOMMap.h:
        (WebCore::WeakReferenceMap::clear):
        * bindings/v8/WorkerScriptController.cpp:
        (WebCore::WorkerScriptController::~WorkerScriptController):


git-svn-id: svn://svn.chromium.org/blink/trunk@54361 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 39e712d4
2010-02-04 Stephen White <senorblanco@chromium.org>
Unreviewed, build fix for Chromium.
Revert r54341 ("[v8] Remove clear method from DOM object maps"),
since it causes the worker tests to fail on Chromium.
* bindings/v8/DOMData.h:
(WebCore::DOMData::removeObjectsFromWrapperMap):
* bindings/v8/DOMDataStore.h:
(WebCore::ChunkedTable::clear):
(WebCore::ChunkedTable::clearEntries):
(WebCore::DOMDataStore::IntrusiveDOMWrapperMap::clear):
(WebCore::DOMDataStore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
* bindings/v8/V8DOMMap.cpp:
(WebCore::removeAllDOMObjectsInCurrentThreadHelper):
(WebCore::removeAllDOMObjectsInCurrentThread):
* bindings/v8/V8DOMMap.h:
(WebCore::WeakReferenceMap::clear):
* bindings/v8/WorkerScriptController.cpp:
(WebCore::WorkerScriptController::~WorkerScriptController):
2010-02-04 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> 2010-02-04 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk>
Reviewed by Xan Lopez. Reviewed by Xan Lopez.
......
...@@ -112,6 +112,14 @@ namespace WebCore { ...@@ -112,6 +112,14 @@ namespace WebCore {
} }
} }
template<typename T>
void DOMData::removeObjectsFromWrapperMap(AbstractWeakReferenceMap<T, v8::Object>& domMap)
{
WrapperMapObjectRemover<T> remover;
domMap.visit(&remover);
domMap.clear();
}
} // namespace WebCore } // namespace WebCore
#endif // DOMData_h #endif // DOMData_h
...@@ -84,6 +84,27 @@ namespace WebCore { ...@@ -84,6 +84,27 @@ namespace WebCore {
ASSERT(!m_chunks || ((m_chunks->m_entries < m_current) && (m_current <= m_last))); ASSERT(!m_chunks || ((m_chunks->m_entries < m_current) && (m_current <= m_last)));
} }
void clear()
{
if (!m_chunks)
return;
clearEntries(m_chunks->m_entries, m_current);
Chunk* last = m_chunks;
while (true) {
Chunk* previous = last->m_previous;
if (!previous)
break;
delete last;
clearEntries(previous->m_entries, previous->m_entries + CHUNK_SIZE);
last = previous;
}
m_chunks = last;
m_current = m_chunks->m_entries;
m_last = m_current + CHUNK_SIZE;
}
void visit(typename Traits::Visitor* visitor) void visit(typename Traits::Visitor* visitor)
{ {
if (!m_chunks) if (!m_chunks)
...@@ -101,6 +122,12 @@ namespace WebCore { ...@@ -101,6 +122,12 @@ namespace WebCore {
T m_entries[CHUNK_SIZE]; T m_entries[CHUNK_SIZE];
}; };
static void clearEntries(T* first, T* last)
{
for (T* entry = first; entry < last; entry++)
Traits::clear(entry);
}
static void visitEntries(T* first, T* last, typename Traits::Visitor* visitor) static void visitEntries(T* first, T* last, typename Traits::Visitor* visitor)
{ {
for (T* entry = first; entry < last; entry++) for (T* entry = first; entry < last; entry++)
...@@ -181,6 +208,11 @@ namespace WebCore { ...@@ -181,6 +208,11 @@ namespace WebCore {
virtual bool removeIfPresent(Node* key, v8::Persistent<v8::Data> value); virtual bool removeIfPresent(Node* key, v8::Persistent<v8::Data> value);
virtual void clear()
{
m_table.clear();
}
private: private:
static int const numberOfEntries = (1 << 10) - 1; static int const numberOfEntries = (1 << 10) - 1;
...@@ -195,6 +227,15 @@ namespace WebCore { ...@@ -195,6 +227,15 @@ namespace WebCore {
node->setWrapper(target); node->setWrapper(target);
} }
static void clear(v8::Persistent<v8::Object>* entry)
{
Node* node = V8Node::toNative(*entry);
ASSERT(node->wrapper() == entry);
node->clearWrapper();
entry->Dispose();
}
static void visit(v8::Persistent<v8::Object>* entry, Visitor* visitor) static void visit(v8::Persistent<v8::Object>* entry, Visitor* visitor)
{ {
Node* node = V8Node::toNative(*entry); Node* node = V8Node::toNative(*entry);
......
...@@ -95,6 +95,45 @@ DOMWrapperMap<void>& getDOMSVGObjectWithContextMap() ...@@ -95,6 +95,45 @@ DOMWrapperMap<void>& getDOMSVGObjectWithContextMap()
#endif // ENABLE(SVG) #endif // ENABLE(SVG)
static void removeAllDOMObjectsInCurrentThreadHelper()
{
v8::HandleScope scope;
// Deref all objects in the delayed queue.
DOMData::getCurrent()->derefDelayedObjects();
// The DOM objects with the following types only exist on the main thread.
if (WTF::isMainThread()) {
// Remove all DOM nodes.
DOMData::removeObjectsFromWrapperMap<Node>(getDOMNodeMap());
#if ENABLE(SVG)
// Remove all SVG element instances in the wrapper map.
DOMData::removeObjectsFromWrapperMap<SVGElementInstance>(getDOMSVGElementInstanceMap());
// Remove all SVG objects with context in the wrapper map.
DOMData::removeObjectsFromWrapperMap<void>(getDOMSVGObjectWithContextMap());
#endif
}
// Remove all DOM objects in the wrapper map.
DOMData::removeObjectsFromWrapperMap<void>(getDOMObjectMap());
// Remove all active DOM objects in the wrapper map.
DOMData::removeObjectsFromWrapperMap<void>(getActiveDOMObjectMap());
}
void removeAllDOMObjectsInCurrentThread()
{
// Use the locker only if it has already been invoked before, as by worker thread.
if (v8::Locker::IsActive()) {
v8::Locker locker;
removeAllDOMObjectsInCurrentThreadHelper();
} else
removeAllDOMObjectsInCurrentThreadHelper();
}
void visitDOMNodesInCurrentThread(DOMWrapperMap<Node>::Visitor* visitor) void visitDOMNodesInCurrentThread(DOMWrapperMap<Node>::Visitor* visitor)
{ {
v8::HandleScope scope; v8::HandleScope scope;
......
...@@ -58,6 +58,7 @@ namespace WebCore { ...@@ -58,6 +58,7 @@ namespace WebCore {
virtual bool contains(KeyType* obj) = 0; virtual bool contains(KeyType* obj) = 0;
virtual void visit(Visitor* visitor) = 0; virtual void visit(Visitor* visitor) = 0;
virtual bool removeIfPresent(KeyType* key, v8::Persistent<v8::Data> value) = 0; virtual bool removeIfPresent(KeyType* key, v8::Persistent<v8::Data> value) = 0;
virtual void clear() = 0;
v8::WeakReferenceCallback weakReferenceCallback() { return m_weakReferenceCallback; } v8::WeakReferenceCallback weakReferenceCallback() { return m_weakReferenceCallback; }
private: private:
...@@ -118,6 +119,11 @@ namespace WebCore { ...@@ -118,6 +119,11 @@ namespace WebCore {
return true; return true;
} }
void clear()
{
m_map.clear();
}
bool contains(KeyType* obj) { return m_map.contains(obj); } bool contains(KeyType* obj) { return m_map.contains(obj); }
virtual void visit(typename Parent::Visitor* visitor) virtual void visit(typename Parent::Visitor* visitor)
...@@ -164,6 +170,9 @@ namespace WebCore { ...@@ -164,6 +170,9 @@ namespace WebCore {
DOMWrapperMap<void>& getActiveDOMObjectMap(); DOMWrapperMap<void>& getActiveDOMObjectMap();
void visitActiveDOMObjectsInCurrentThread(DOMWrapperMap<void>::Visitor*); void visitActiveDOMObjectsInCurrentThread(DOMWrapperMap<void>::Visitor*);
// This should be called to remove all DOM objects associated with the current thread when it is tearing down.
void removeAllDOMObjectsInCurrentThread();
#if ENABLE(SVG) #if ENABLE(SVG)
// A map for SVGElementInstances to its JS wrapper. // A map for SVGElementInstances to its JS wrapper.
DOMWrapperMap<SVGElementInstance>& getDOMSVGElementInstanceMap(); DOMWrapperMap<SVGElementInstance>& getDOMSVGElementInstanceMap();
......
...@@ -57,6 +57,7 @@ WorkerScriptController::WorkerScriptController(WorkerContext* workerContext) ...@@ -57,6 +57,7 @@ WorkerScriptController::WorkerScriptController(WorkerContext* workerContext)
WorkerScriptController::~WorkerScriptController() WorkerScriptController::~WorkerScriptController()
{ {
removeAllDOMObjectsInCurrentThread();
} }
ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode) ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment