Index: Source/core/inspector/InspectorHeapProfilerAgent.cpp |
diff --git a/Source/core/inspector/InspectorHeapProfilerAgent.cpp b/Source/core/inspector/InspectorHeapProfilerAgent.cpp |
index caf386c6e4e3f4b2075d99aec3295022e9549de8..5be2c0d0ba354ecc42282d7df74df6d2c451f6f4 100644 |
--- a/Source/core/inspector/InspectorHeapProfilerAgent.cpp |
+++ b/Source/core/inspector/InspectorHeapProfilerAgent.cpp |
@@ -37,6 +37,8 @@ |
#include "InstrumentingAgents.h" |
#include "ScriptProfiler.h" |
#include "WebCoreMemoryInstrumentation.h" |
+#include "core/platform/Timer.h" |
+#include <wtf/CurrentTime.h> |
#include <wtf/MemoryInstrumentationHashMap.h> |
namespace WebCore { |
@@ -76,6 +78,7 @@ void InspectorHeapProfilerAgent::clearProfiles(ErrorString*) |
void InspectorHeapProfilerAgent::resetFrontendProfiles() |
{ |
+ stopTrackingHeapObjects(0); |
if (!m_frontend) |
return; |
if (!m_state->getBoolean(HeapProfilerAgentState::profileHeadersRequested)) |
@@ -114,6 +117,90 @@ PassRefPtr<TypeBuilder::HeapProfiler::ProfileHeader> InspectorHeapProfilerAgent: |
return header.release(); |
} |
+class HeapStatsUpdateTask { |
yurys
2013/04/25 12:23:15
Please move class definitions to the top before me
loislo
2013/04/25 13:33:56
Done.
|
+public: |
+ HeapStatsUpdateTask(InspectorHeapProfilerAgent*); |
+ void startTimer(); |
+ void resetTimer() { m_timer.stop(); } |
+ void onTimer(Timer<HeapStatsUpdateTask>*); |
+ |
+private: |
+ InspectorHeapProfilerAgent* m_heapProfilerAgent; |
+ Timer<HeapStatsUpdateTask> m_timer; |
+}; |
+ |
+HeapStatsUpdateTask::HeapStatsUpdateTask(InspectorHeapProfilerAgent* heapProfilerAgent) |
+ : m_heapProfilerAgent(heapProfilerAgent) |
+ , m_timer(this, &HeapStatsUpdateTask::onTimer) |
+{ |
+} |
+ |
+void HeapStatsUpdateTask::onTimer(Timer<HeapStatsUpdateTask>*) |
+{ |
+ // The timer is stopped on m_heapProfilerAgent destruction, |
+ // so this method will never be called after m_heapProfilerAgent has been destroyed. |
+ m_heapProfilerAgent->requestHeapStatsUpdate(); |
+} |
+ |
+void HeapStatsUpdateTask::startTimer() |
+{ |
+ ASSERT(!m_timer.isActive()); |
+ m_timer.startRepeating(0.05); |
+} |
+ |
+class HeapStatsStream : public ScriptProfiler::OutputStream { |
+public: |
+ HeapStatsStream(InspectorHeapProfilerAgent* heapProfilerAgent) |
+ : m_heapProfilerAgent(heapProfilerAgent) |
+ { |
+ } |
+ virtual void write(const uint32_t* chunk, const int size) OVERRIDE |
+ { |
+ ASSERT(chunk); |
+ ASSERT(size > 0); |
+ m_heapProfilerAgent->pushHeapStatsUpdate(chunk, size); |
+ } |
+private: |
+ InspectorHeapProfilerAgent* m_heapProfilerAgent; |
+}; |
+ |
+void InspectorHeapProfilerAgent::startTrackingHeapObjects(ErrorString*) |
+{ |
+ if (m_heapStatsUpdateTask) |
+ return; |
+ ScriptProfiler::startTrackingHeapObjects(); |
+ m_heapStatsUpdateTask = adoptPtr(new HeapStatsUpdateTask(this)); |
+ m_heapStatsUpdateTask->startTimer(); |
+} |
+ |
+void InspectorHeapProfilerAgent::requestHeapStatsUpdate() |
+{ |
+ if (!m_frontend) |
+ return; |
+ HeapStatsStream stream(this); |
+ SnapshotObjectId lastSeenObjectId = ScriptProfiler::requestHeapStatsUpdate(&stream); |
+ m_frontend->lastSeenObjectId(lastSeenObjectId, WTF::currentTimeMS()); |
+} |
+ |
+void InspectorHeapProfilerAgent::pushHeapStatsUpdate(const uint32_t* const data, const int size) |
+{ |
+ if (!m_frontend) |
+ return; |
+ RefPtr<TypeBuilder::Array<int> > statsDiff = TypeBuilder::Array<int>::create(); |
+ for (int i = 0; i < size; ++i) |
+ statsDiff->addItem(data[i]); |
+ m_frontend->heapStatsUpdate(statsDiff.release()); |
+} |
+ |
+void InspectorHeapProfilerAgent::stopTrackingHeapObjects(ErrorString*) |
+{ |
+ if (!m_heapStatsUpdateTask) |
+ return; |
+ ScriptProfiler::stopTrackingHeapObjects(); |
+ m_heapStatsUpdateTask->resetTimer(); |
+ m_heapStatsUpdateTask.release(); |
yurys
2013/04/25 12:23:15
m_heapStatsUpdateTask.clear() not release()
loislo
2013/04/25 13:33:56
Done.
|
+} |
+ |
void InspectorHeapProfilerAgent::getProfileHeaders(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::HeapProfiler::ProfileHeader> >& headers) |
{ |
m_state->setBoolean(HeapProfilerAgentState::profileHeadersRequested, true); |