Chromium Code Reviews| Index: Source/core/inspector/AsyncCallStackTracker.cpp |
| diff --git a/Source/core/inspector/AsyncCallStackTracker.cpp b/Source/core/inspector/AsyncCallStackTracker.cpp |
| index f899e041ec14d62c1432c7bfbab0c78c3a105b8c..93c6cac768f96ec0485a7b509fa014aefc9751a3 100644 |
| --- a/Source/core/inspector/AsyncCallStackTracker.cpp |
| +++ b/Source/core/inspector/AsyncCallStackTracker.cpp |
| @@ -63,15 +63,26 @@ class AsyncCallStackTracker::AsyncCallChainMap final { |
| ALLOW_ONLY_INLINE_ALLOCATION(); |
| public: |
| using MapType = WillBeHeapHashMap<K, RefPtrWillBeMember<AsyncCallStackTracker::AsyncCallChain>>; |
| - explicit AsyncCallChainMap(AsyncCallStackTracker* tracker) : m_tracker(tracker) { } |
| + explicit AsyncCallChainMap(AsyncCallStackTracker* tracker) |
| + : m_tracker(tracker) |
| + { |
| + } |
| ~AsyncCallChainMap() |
| { |
| + // Verify that this object has been explicitly cleared already. |
| + ASSERT(!m_tracker); |
| + } |
| + |
| + void dispose() |
| + { |
| clear(); |
|
aandrey
2014/12/12 10:57:47
nit: ASSERT(m_tracker);
sof
2014/12/12 11:04:31
Seems excessive.
|
| + m_tracker = nullptr; |
| } |
| void clear() |
| { |
| + ASSERT(m_tracker); |
| for (auto it : m_asyncCallChains) { |
| if (AsyncCallStackTracker::Listener* listener = m_tracker->m_listener) |
| listener->didRemoveAsyncCallChain(it.value.get()); |
| @@ -79,6 +90,7 @@ public: |
| break; |
| } |
| m_asyncCallChains.clear(); |
| + m_tracker = nullptr; |
|
aandrey
2014/12/12 10:57:47
remove
sof
2014/12/12 11:04:31
Done.
|
| } |
| void set(typename MapType::KeyPeekInType key, PassRefPtrWillBeRawPtr<AsyncCallChain> chain) |
| @@ -98,6 +110,7 @@ public: |
| void remove(typename MapType::KeyPeekInType key) |
| { |
| + ASSERT(m_tracker); |
| RefPtrWillBeRawPtr<AsyncCallStackTracker::AsyncCallChain> chain = m_asyncCallChains.take(key); |
| if (chain && m_tracker->m_listener) |
| m_tracker->m_listener->didRemoveAsyncCallChain(chain.get()); |
| @@ -105,11 +118,12 @@ public: |
| void trace(Visitor* visitor) |
| { |
| + visitor->trace(m_tracker); |
| visitor->trace(m_asyncCallChains); |
| } |
| private: |
| - AsyncCallStackTracker* m_tracker; |
| + RawPtrWillBeMember<AsyncCallStackTracker> m_tracker; |
| MapType m_asyncCallChains; |
| }; |
| @@ -137,6 +151,7 @@ public: |
| OwnPtrWillBeRawPtr<ExecutionContextData> self = m_tracker->m_executionContextDataMap.take(executionContext()); |
| ASSERT_UNUSED(self, self == this); |
| ContextLifecycleObserver::contextDestroyed(); |
| + dispose(); |
| } |
| int nextAsyncOperationUniqueId() |
| @@ -164,6 +179,18 @@ public: |
| #endif |
| } |
| + void dispose() |
| + { |
| + m_timerCallChains.dispose(); |
| + m_animationFrameCallChains.dispose(); |
| + m_eventCallChains.dispose(); |
| + m_xhrCallChains.dispose(); |
| + m_mutationObserverCallChains.dispose(); |
| + m_executionContextTaskCallChains.dispose(); |
| + m_v8AsyncTaskCallChains.dispose(); |
| + m_asyncOperationCallChains.dispose(); |
| + } |
| + |
| RawPtrWillBeMember<AsyncCallStackTracker> m_tracker; |
| HashSet<int> m_intervalTimerIds; |
| AsyncCallChainMap<int> m_timerCallChains; |
| @@ -598,6 +625,8 @@ void AsyncCallStackTracker::clear() |
| { |
| m_currentAsyncCallChain.clear(); |
| m_nestedAsyncCallCount = 0; |
| + for (auto& it : m_executionContextDataMap) |
| + it.value->dispose(); |
| m_executionContextDataMap.clear(); |
| } |