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) |