{
}
-void InspectorHeapProfilerAgent::clearProfiles(ErrorString*)
-{
- m_snapshots.clear();
- m_nextUserInitiatedHeapSnapshotNumber = 1;
- stopTrackingHeapObjectsInternal();
- resetFrontendProfiles();
- m_injectedScriptManager->injectedScriptHost()->clearInspectedObjects();
-}
-
-void InspectorHeapProfilerAgent::resetFrontendProfiles()
-{
- if (!m_frontend)
- return;
- if (!m_state->getBoolean(HeapProfilerAgentState::heapProfilerEnabled))
- return;
- if (m_snapshots.isEmpty())
- m_frontend->resetProfiles();
-}
-
void InspectorHeapProfilerAgent::setFrontend(InspectorFrontend* frontend)
{
m_frontend = frontend->heapprofiler();
void InspectorHeapProfilerAgent::clearFrontend()
{
m_frontend = 0;
+
+ m_nextUserInitiatedHeapSnapshotNumber = 1;
+ stopTrackingHeapObjectsInternal();
+ m_injectedScriptManager->injectedScriptHost()->clearInspectedObjects();
+
ErrorString error;
- clearProfiles(&error);
disable(&error);
}
void InspectorHeapProfilerAgent::restore()
{
- resetFrontendProfiles();
+ if (m_state->getBoolean(HeapProfilerAgentState::heapProfilerEnabled))
+ m_frontend->resetProfiles();
}
void InspectorHeapProfilerAgent::collectGarbage(WebCore::ErrorString*)
ScriptProfiler::collectGarbage();
}
-PassRefPtr<TypeBuilder::HeapProfiler::ProfileHeader> InspectorHeapProfilerAgent::createSnapshotHeader(const ScriptHeapSnapshot& snapshot)
-{
- RefPtr<TypeBuilder::HeapProfiler::ProfileHeader> header = TypeBuilder::HeapProfiler::ProfileHeader::create()
- .setUid(snapshot.uid())
- .setTitle(snapshot.title());
- return header.release();
-}
-
InspectorHeapProfilerAgent::HeapStatsUpdateTask::HeapStatsUpdateTask(InspectorHeapProfilerAgent* heapProfilerAgent)
: m_heapProfilerAgent(heapProfilerAgent)
, m_timer(this, &HeapStatsUpdateTask::onTimer)
InspectorHeapProfilerAgent* m_heapProfilerAgent;
};
-void InspectorHeapProfilerAgent::startTrackingHeapObjects(ErrorString*)
+void InspectorHeapProfilerAgent::startTrackingHeapObjects(ErrorString*, const bool* trackAllocations)
{
if (m_heapStatsUpdateTask)
return;
- ScriptProfiler::startTrackingHeapObjects();
+ ScriptProfiler::startTrackingHeapObjects(trackAllocations && *trackAllocations);
m_heapStatsUpdateTask = adoptPtr(new HeapStatsUpdateTask(this));
m_heapStatsUpdateTask->startTimer();
}
m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, false);
}
-void InspectorHeapProfilerAgent::getHeapSnapshot(ErrorString* errorString, int rawUid)
-{
- class OutputStream FINAL : public ScriptHeapSnapshot::OutputStream {
- public:
- OutputStream(InspectorFrontend::HeapProfiler* frontend, unsigned uid)
- : m_frontend(frontend), m_uid(uid) { }
- virtual void Write(const String& chunk) OVERRIDE { m_frontend->addHeapSnapshotChunk(m_uid, chunk); }
- virtual void Close() OVERRIDE { }
- private:
- InspectorFrontend::HeapProfiler* m_frontend;
- int m_uid;
- };
-
- unsigned uid = static_cast<unsigned>(rawUid);
- IdToHeapSnapshotMap::iterator it = m_snapshots.find(uid);
- if (it == m_snapshots.end()) {
- *errorString = "Profile wasn't found";
- return;
- }
- RefPtr<ScriptHeapSnapshot> snapshot = it->value;
- if (m_frontend) {
- OutputStream stream(m_frontend, uid);
- snapshot->writeJSON(&stream);
- }
-}
-
-void InspectorHeapProfilerAgent::removeProfile(ErrorString*, int rawUid)
-{
- unsigned uid = static_cast<unsigned>(rawUid);
- if (m_snapshots.contains(uid))
- m_snapshots.remove(uid);
-}
-
-void InspectorHeapProfilerAgent::takeHeapSnapshot(ErrorString*, const bool* reportProgress)
+void InspectorHeapProfilerAgent::takeHeapSnapshot(ErrorString* errorString, const bool* reportProgress)
{
class HeapSnapshotProgress FINAL : public ScriptProfiler::HeapSnapshotProgress {
public:
virtual void Worked(int workDone) OVERRIDE
{
if (m_frontend)
- m_frontend->reportHeapSnapshotProgress(workDone, m_totalWork);
+ m_frontend->reportHeapSnapshotProgress(workDone, m_totalWork, 0);
+ }
+ virtual void Done() OVERRIDE
+ {
+ const bool finished = true;
+ if (m_frontend)
+ m_frontend->reportHeapSnapshotProgress(m_totalWork, m_totalWork, &finished);
}
- virtual void Done() OVERRIDE { }
virtual bool isCanceled() OVERRIDE { return false; }
private:
InspectorFrontend::HeapProfiler* m_frontend;
String title = "Snapshot " + String::number(m_nextUserInitiatedHeapSnapshotNumber++);
HeapSnapshotProgress progress(reportProgress && *reportProgress ? m_frontend : 0);
RefPtr<ScriptHeapSnapshot> snapshot = ScriptProfiler::takeHeapSnapshot(title, &progress);
- if (snapshot) {
- m_snapshots.add(snapshot->uid(), snapshot);
- if (m_frontend)
- m_frontend->addProfileHeader(createSnapshotHeader(*snapshot));
+ if (!snapshot) {
+ *errorString = "Failed to take heap snapshot";
+ return;
+ }
+
+ class OutputStream : public ScriptHeapSnapshot::OutputStream {
+ public:
+ explicit OutputStream(InspectorFrontend::HeapProfiler* frontend)
+ : m_frontend(frontend) { }
+ void Write(const String& chunk) { m_frontend->addHeapSnapshotChunk(chunk); }
+ void Close() { }
+ private:
+ InspectorFrontend::HeapProfiler* m_frontend;
+ };
+
+ if (m_frontend) {
+ OutputStream stream(m_frontend);
+ snapshot->writeJSON(&stream);
}
}