Chromium Code Reviews| Index: Source/core/inspector/AsyncCallStackTracker.cpp |
| diff --git a/Source/core/inspector/AsyncCallStackTracker.cpp b/Source/core/inspector/AsyncCallStackTracker.cpp |
| index 5f06f3f431222271a8835d2cda81e3a51ed7b667..07d80ef7057d5e9416d60ee95efec29ec695fccf 100644 |
| --- a/Source/core/inspector/AsyncCallStackTracker.cpp |
| +++ b/Source/core/inspector/AsyncCallStackTracker.cpp |
| @@ -33,6 +33,7 @@ |
| #include "bindings/core/v8/V8Binding.h" |
| #include "bindings/core/v8/V8RecursionScope.h" |
| +#include "core/dom/ContextLifecycleObserver.h" |
| #include "core/dom/ExecutionContext.h" |
| #include "core/dom/ExecutionContextTask.h" |
| #include "core/dom/Microtask.h" |
| @@ -56,36 +57,62 @@ static const char enqueueMutationRecordName[] = "Mutation"; |
| namespace blink { |
| -void AsyncCallStackTracker::ExecutionContextData::contextDestroyed() |
| -{ |
| - ASSERT(executionContext()); |
| - OwnPtrWillBeRawPtr<ExecutionContextData> self = m_tracker->m_executionContextDataMap.take(executionContext()); |
| - ASSERT_UNUSED(self, self == this); |
| - ContextLifecycleObserver::contextDestroyed(); |
| -} |
| +class AsyncCallStackTracker::ExecutionContextData final : public NoBaseWillBeGarbageCollectedFinalized<ExecutionContextData>, public ContextLifecycleObserver { |
| + WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; |
| +public: |
| + ExecutionContextData(AsyncCallStackTracker* tracker, ExecutionContext* executionContext) |
| + : ContextLifecycleObserver(executionContext) |
| + , m_circularSequentialID(0) |
| + , m_tracker(tracker) |
| + { |
| + } |
| -int AsyncCallStackTracker::ExecutionContextData::circularSequentialID() |
| -{ |
| - ++m_circularSequentialID; |
| - if (m_circularSequentialID <= 0) |
| - m_circularSequentialID = 1; |
| - return m_circularSequentialID; |
| -} |
| + virtual void contextDestroyed() override |
| + { |
| + ASSERT(executionContext()); |
| + OwnPtrWillBeRawPtr<ExecutionContextData> self = adoptPtrWillBeNoop(m_tracker->m_executionContextDataMap.take(executionContext())); |
| + ASSERT_UNUSED(self, self == this); |
| + ContextLifecycleObserver::contextDestroyed(); |
| + } |
| -void AsyncCallStackTracker::ExecutionContextData::trace(Visitor* visitor) |
| -{ |
| - visitor->trace(m_tracker); |
| + int circularSequentialID() |
| + { |
| + ++m_circularSequentialID; |
| + if (m_circularSequentialID <= 0) |
| + m_circularSequentialID = 1; |
| + return m_circularSequentialID; |
| + } |
| + |
| + void trace(Visitor* visitor) |
| + { |
| + visitor->trace(m_tracker); |
| #if ENABLE(OILPAN) |
| - visitor->trace(m_timerCallChains); |
| - visitor->trace(m_animationFrameCallChains); |
| - visitor->trace(m_eventCallChains); |
| - visitor->trace(m_xhrCallChains); |
| - visitor->trace(m_mutationObserverCallChains); |
| - visitor->trace(m_executionContextTaskCallChains); |
| - visitor->trace(m_v8AsyncTaskCallChains); |
| - visitor->trace(m_asyncOperationCallChains); |
| + visitor->trace(m_timerCallChains); |
| + visitor->trace(m_animationFrameCallChains); |
| + visitor->trace(m_eventCallChains); |
| + visitor->trace(m_xhrCallChains); |
| + visitor->trace(m_mutationObserverCallChains); |
| + visitor->trace(m_executionContextTaskCallChains); |
| + visitor->trace(m_v8AsyncTaskCallChains); |
| + visitor->trace(m_asyncOperationCallChains); |
| #endif |
| -} |
| + } |
| + |
| +private: |
| + int m_circularSequentialID; |
| + |
| +public: |
|
yurys
2014/11/11 12:31:37
Just move these fields above the private: section
|
| + RawPtrWillBeMember<AsyncCallStackTracker> m_tracker; |
| + HashSet<int> m_intervalTimerIds; |
| + WillBeHeapHashMap<int, RefPtrWillBeMember<AsyncCallChain> > m_timerCallChains; |
| + WillBeHeapHashMap<int, RefPtrWillBeMember<AsyncCallChain> > m_animationFrameCallChains; |
| + WillBeHeapHashMap<RawPtrWillBeMember<Event>, RefPtrWillBeMember<AsyncCallChain> > m_eventCallChains; |
| + WillBeHeapHashMap<RawPtrWillBeMember<EventTarget>, RefPtrWillBeMember<AsyncCallChain> > m_xhrCallChains; |
| + WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, RefPtrWillBeMember<AsyncCallChain> > m_mutationObserverCallChains; |
| + WillBeHeapHashMap<ExecutionContextTask*, RefPtrWillBeMember<AsyncCallChain> > m_executionContextTaskCallChains; |
| + WillBeHeapHashMap<String, RefPtrWillBeMember<AsyncCallChain> > m_v8AsyncTaskCallChains; |
| + WillBeHeapHashMap<int, RefPtrWillBeMember<AsyncCallChain> > m_asyncOperationCallChains; |
| +}; |
| static XMLHttpRequest* toXmlHttpRequest(EventTarget* eventTarget) |
| { |
| @@ -454,8 +481,8 @@ AsyncCallStackTracker::ExecutionContextData* AsyncCallStackTracker::createContex |
| { |
| ExecutionContextData* data = m_executionContextDataMap.get(context); |
| if (!data) { |
| - data = m_executionContextDataMap.set(context, adoptPtrWillBeNoop(new AsyncCallStackTracker::ExecutionContextData(this, context))) |
|
yurys
2014/11/11 12:31:37
Please revert this. The code before your change fo
|
| - .storedValue->value.get(); |
| + data = new AsyncCallStackTracker::ExecutionContextData(this, context); |
| + m_executionContextDataMap.set(context, data); |
| } |
| return data; |
| } |
| @@ -464,7 +491,14 @@ void AsyncCallStackTracker::clear() |
| { |
| m_currentAsyncCallChain.clear(); |
| m_nestedAsyncCallCount = 0; |
| +#if ENABLE(OILPAN) |
| m_executionContextDataMap.clear(); |
| +#else |
| + ExecutionContextDataMap copy; |
| + m_executionContextDataMap.swap(copy); |
| + for (ExecutionContextDataMap::const_iterator it = copy.begin(); it != copy.end(); ++it) |
| + delete it->value; |
| +#endif |
| } |
| void AsyncCallStackTracker::trace(Visitor* visitor) |