| Index: third_party/WebKit/WebCore/bindings/v8/V8DOMMap.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/bindings/v8/V8DOMMap.cpp (revision 13509)
|
| +++ third_party/WebKit/WebCore/bindings/v8/V8DOMMap.cpp (working copy)
|
| @@ -40,6 +40,7 @@
|
| #include <wtf/StdLibExtras.h>
|
| #include <wtf/Threading.h>
|
| #include <wtf/ThreadSpecific.h>
|
| +#include <wtf/Vector.h>
|
|
|
| namespace WebCore {
|
|
|
| @@ -103,23 +104,21 @@
|
| // The helper function will be scheduled by the GC thread to get called from the owning thread.
|
| static void derefDelayedObjectsInCurrentThread(void*);
|
|
|
| -// This should be called to remove all DOM objects associated with the current thread when it is tearing down.
|
| -static void removeAllDOMObjectsInCurrentThread();
|
| -
|
| -// A map from a thread ID to thread's specific data.
|
| +// A list of all ThreadSpecific DOM Data objects. Traversed during GC to find a thread-specific map that
|
| +// contains the object - so we can schedule the object to be deleted on the thread which created it.
|
| class ThreadSpecificDOMData;
|
| -typedef WTF::HashMap<WTF::ThreadIdentifier, ThreadSpecificDOMData*> DOMThreadMap;
|
| -static DOMThreadMap& domThreadMap()
|
| +typedef WTF::Vector<ThreadSpecificDOMData*> DOMDataList;
|
| +static DOMDataList& domDataList()
|
| {
|
| - DEFINE_STATIC_LOCAL(DOMThreadMap, staticDOMThreadMap, ());
|
| - return staticDOMThreadMap;
|
| + DEFINE_STATIC_LOCAL(DOMDataList, staticDOMDataList, ());
|
| + return staticDOMDataList;
|
| }
|
|
|
| -// Mutex to protect against concurrent access of domThreadMap.
|
| -static WTF::Mutex& domThreadMapMutex()
|
| +// Mutex to protect against concurrent access of DOMDataList.
|
| +static WTF::Mutex& domDataListMutex()
|
| {
|
| - DEFINE_STATIC_LOCAL(WTF::Mutex, staticDOMThreadMapMutex, ());
|
| - return staticDOMThreadMapMutex;
|
| + DEFINE_STATIC_LOCAL(WTF::Mutex, staticDOMDataListMutex, ());
|
| + return staticDOMDataListMutex;
|
| }
|
|
|
| class ThreadSpecificDOMData : Noncopyable {
|
| @@ -161,14 +160,14 @@
|
| , m_delayedProcessingScheduled(false)
|
| , m_isMainThread(WTF::isMainThread())
|
| {
|
| - WTF::MutexLocker locker(domThreadMapMutex());
|
| - domThreadMap().set(WTF::currentThread(), this);
|
| + WTF::MutexLocker locker(domDataListMutex());
|
| + domDataList().append(this);
|
| }
|
|
|
| virtual ~ThreadSpecificDOMData()
|
| {
|
| - WTF::MutexLocker locker(domThreadMapMutex());
|
| - domThreadMap().remove(WTF::currentThread());
|
| + WTF::MutexLocker locker(domDataListMutex());
|
| + domDataList().remove(domDataList().find(this));
|
| }
|
|
|
| void* getDOMWrapperMap(DOMWrapperMapType type)
|
| @@ -241,8 +240,6 @@
|
| // We assume that all child threads running V8 instances are created by WTF.
|
| virtual ~NonMainThreadSpecificDOMData()
|
| {
|
| - removeAllDOMObjectsInCurrentThread();
|
| -
|
| delete m_domNodeMap;
|
| delete m_domObjectMap;
|
| delete m_activeDomObjectMap;
|
| @@ -385,17 +382,11 @@
|
| template<typename T>
|
| static void handleWeakObjectInOwningThread(ThreadSpecificDOMData::DOMWrapperMapType mapType, V8ClassIndex::V8WrapperType objectType, T* object)
|
| {
|
| - WTF::MutexLocker locker(domThreadMapMutex());
|
| - for (typename DOMThreadMap::iterator iter(domThreadMap().begin()); iter != domThreadMap().end(); ++iter) {
|
| - WTF::ThreadIdentifier threadID = iter->first;
|
| - ThreadSpecificDOMData* threadData = iter->second;
|
| + WTF::MutexLocker locker(domDataListMutex());
|
| + DOMDataList& list = domDataList();
|
| + for (size_t i = 0; i < list.size(); ++i) {
|
| + ThreadSpecificDOMData* threadData = list[i];
|
|
|
| - // Skip the current thread that is GC thread.
|
| - if (threadID == WTF::currentThread()) {
|
| - ASSERT(!static_cast<DOMWrapperMap<T>*>(threadData->getDOMWrapperMap(mapType))->contains(object));
|
| - continue;
|
| - }
|
| -
|
| ThreadSpecificDOMData::InternalDOMWrapperMap<T>* domMap = static_cast<ThreadSpecificDOMData::InternalDOMWrapperMap<T>*>(threadData->getDOMWrapperMap(mapType));
|
| if (domMap->contains(object)) {
|
| // Clear the JS reference.
|
| @@ -514,7 +505,7 @@
|
|
|
| static void derefDelayedObjects()
|
| {
|
| - WTF::MutexLocker locker(domThreadMapMutex());
|
| + WTF::MutexLocker locker(domDataListMutex());
|
|
|
| getThreadSpecificDOMData().setDelayedProcessingScheduled(false);
|
|
|
| @@ -573,7 +564,7 @@
|
| #endif
|
| }
|
|
|
| -static void removeAllDOMObjectsInCurrentThread()
|
| +void removeAllDOMObjectsInCurrentThread()
|
| {
|
| // Use the locker only if it has already been invoked before, as by worker thread.
|
| if (v8::Locker::IsActive()) {
|
|
|