| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "core/inspector/InspectorState.h" | 38 #include "core/inspector/InspectorState.h" |
| 39 #include "platform/Timer.h" | 39 #include "platform/Timer.h" |
| 40 #include "wtf/CurrentTime.h" | 40 #include "wtf/CurrentTime.h" |
| 41 | 41 |
| 42 namespace WebCore { | 42 namespace WebCore { |
| 43 | 43 |
| 44 typedef uint32_t SnapshotObjectId; | 44 typedef uint32_t SnapshotObjectId; |
| 45 | 45 |
| 46 namespace HeapProfilerAgentState { | 46 namespace HeapProfilerAgentState { |
| 47 static const char heapProfilerEnabled[] = "heapProfilerEnabled"; | 47 static const char heapProfilerEnabled[] = "heapProfilerEnabled"; |
| 48 static const char heapObjectsTrackingEnabled[] = "heapObjectsTrackingEnabled"; |
| 49 static const char allocationTrackingEnabled[] = "allocationTrackingEnabled"; |
| 48 } | 50 } |
| 49 | 51 |
| 50 class InspectorHeapProfilerAgent::HeapStatsUpdateTask { | 52 class InspectorHeapProfilerAgent::HeapStatsUpdateTask { |
| 51 public: | 53 public: |
| 52 HeapStatsUpdateTask(InspectorHeapProfilerAgent*); | 54 HeapStatsUpdateTask(InspectorHeapProfilerAgent*); |
| 53 void startTimer(); | 55 void startTimer(); |
| 54 void resetTimer() { m_timer.stop(); } | 56 void resetTimer() { m_timer.stop(); } |
| 55 void onTimer(Timer<HeapStatsUpdateTask>*); | 57 void onTimer(Timer<HeapStatsUpdateTask>*); |
| 56 | 58 |
| 57 private: | 59 private: |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 m_injectedScriptManager->injectedScriptHost()->clearInspectedObjects(); | 92 m_injectedScriptManager->injectedScriptHost()->clearInspectedObjects(); |
| 91 | 93 |
| 92 ErrorString error; | 94 ErrorString error; |
| 93 disable(&error); | 95 disable(&error); |
| 94 } | 96 } |
| 95 | 97 |
| 96 void InspectorHeapProfilerAgent::restore() | 98 void InspectorHeapProfilerAgent::restore() |
| 97 { | 99 { |
| 98 if (m_state->getBoolean(HeapProfilerAgentState::heapProfilerEnabled)) | 100 if (m_state->getBoolean(HeapProfilerAgentState::heapProfilerEnabled)) |
| 99 m_frontend->resetProfiles(); | 101 m_frontend->resetProfiles(); |
| 102 if (m_state->getBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled)) |
| 103 startTrackingHeapObjectsInternal(m_state->getBoolean(HeapProfilerAgentSt
ate::allocationTrackingEnabled)); |
| 100 } | 104 } |
| 101 | 105 |
| 102 void InspectorHeapProfilerAgent::collectGarbage(WebCore::ErrorString*) | 106 void InspectorHeapProfilerAgent::collectGarbage(WebCore::ErrorString*) |
| 103 { | 107 { |
| 104 ScriptProfiler::collectGarbage(); | 108 ScriptProfiler::collectGarbage(); |
| 105 } | 109 } |
| 106 | 110 |
| 107 InspectorHeapProfilerAgent::HeapStatsUpdateTask::HeapStatsUpdateTask(InspectorHe
apProfilerAgent* heapProfilerAgent) | 111 InspectorHeapProfilerAgent::HeapStatsUpdateTask::HeapStatsUpdateTask(InspectorHe
apProfilerAgent* heapProfilerAgent) |
| 108 : m_heapProfilerAgent(heapProfilerAgent) | 112 : m_heapProfilerAgent(heapProfilerAgent) |
| 109 , m_timer(this, &HeapStatsUpdateTask::onTimer) | 113 , m_timer(this, &HeapStatsUpdateTask::onTimer) |
| (...skipping 25 matching lines...) Expand all Loading... |
| 135 ASSERT(chunk); | 139 ASSERT(chunk); |
| 136 ASSERT(size > 0); | 140 ASSERT(size > 0); |
| 137 m_heapProfilerAgent->pushHeapStatsUpdate(chunk, size); | 141 m_heapProfilerAgent->pushHeapStatsUpdate(chunk, size); |
| 138 } | 142 } |
| 139 private: | 143 private: |
| 140 InspectorHeapProfilerAgent* m_heapProfilerAgent; | 144 InspectorHeapProfilerAgent* m_heapProfilerAgent; |
| 141 }; | 145 }; |
| 142 | 146 |
| 143 void InspectorHeapProfilerAgent::startTrackingHeapObjects(ErrorString*, const bo
ol* trackAllocations) | 147 void InspectorHeapProfilerAgent::startTrackingHeapObjects(ErrorString*, const bo
ol* trackAllocations) |
| 144 { | 148 { |
| 145 if (m_heapStatsUpdateTask) | 149 m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, true
); |
| 146 return; | 150 bool allocationTrackingEnabled = trackAllocations && *trackAllocations; |
| 147 ScriptProfiler::startTrackingHeapObjects(trackAllocations && *trackAllocatio
ns); | 151 m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, alloc
ationTrackingEnabled); |
| 148 m_heapStatsUpdateTask = adoptPtr(new HeapStatsUpdateTask(this)); | 152 startTrackingHeapObjectsInternal(allocationTrackingEnabled); |
| 149 m_heapStatsUpdateTask->startTimer(); | |
| 150 } | 153 } |
| 151 | 154 |
| 152 void InspectorHeapProfilerAgent::requestHeapStatsUpdate() | 155 void InspectorHeapProfilerAgent::requestHeapStatsUpdate() |
| 153 { | 156 { |
| 154 if (!m_frontend) | 157 if (!m_frontend) |
| 155 return; | 158 return; |
| 156 HeapStatsStream stream(this); | 159 HeapStatsStream stream(this); |
| 157 SnapshotObjectId lastSeenObjectId = ScriptProfiler::requestHeapStatsUpdate(&
stream); | 160 SnapshotObjectId lastSeenObjectId = ScriptProfiler::requestHeapStatsUpdate(&
stream); |
| 158 m_frontend->lastSeenObjectId(lastSeenObjectId, WTF::currentTimeMS()); | 161 m_frontend->lastSeenObjectId(lastSeenObjectId, WTF::currentTimeMS()); |
| 159 } | 162 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 172 { | 175 { |
| 173 if (!m_heapStatsUpdateTask) { | 176 if (!m_heapStatsUpdateTask) { |
| 174 *error = "Heap object tracking is not started."; | 177 *error = "Heap object tracking is not started."; |
| 175 return; | 178 return; |
| 176 } | 179 } |
| 177 requestHeapStatsUpdate(); | 180 requestHeapStatsUpdate(); |
| 178 takeHeapSnapshot(error, reportProgress); | 181 takeHeapSnapshot(error, reportProgress); |
| 179 stopTrackingHeapObjectsInternal(); | 182 stopTrackingHeapObjectsInternal(); |
| 180 } | 183 } |
| 181 | 184 |
| 185 void InspectorHeapProfilerAgent::startTrackingHeapObjectsInternal(bool trackAllo
cations) |
| 186 { |
| 187 if (m_heapStatsUpdateTask) |
| 188 return; |
| 189 ScriptProfiler::startTrackingHeapObjects(trackAllocations); |
| 190 m_heapStatsUpdateTask = adoptPtr(new HeapStatsUpdateTask(this)); |
| 191 m_heapStatsUpdateTask->startTimer(); |
| 192 } |
| 193 |
| 182 void InspectorHeapProfilerAgent::stopTrackingHeapObjectsInternal() | 194 void InspectorHeapProfilerAgent::stopTrackingHeapObjectsInternal() |
| 183 { | 195 { |
| 184 if (!m_heapStatsUpdateTask) | 196 if (!m_heapStatsUpdateTask) |
| 185 return; | 197 return; |
| 186 ScriptProfiler::stopTrackingHeapObjects(); | 198 ScriptProfiler::stopTrackingHeapObjects(); |
| 187 m_heapStatsUpdateTask->resetTimer(); | 199 m_heapStatsUpdateTask->resetTimer(); |
| 188 m_heapStatsUpdateTask.clear(); | 200 m_heapStatsUpdateTask.clear(); |
| 201 m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, fals
e); |
| 202 m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, false
); |
| 189 } | 203 } |
| 190 | 204 |
| 191 void InspectorHeapProfilerAgent::enable(ErrorString*) | 205 void InspectorHeapProfilerAgent::enable(ErrorString*) |
| 192 { | 206 { |
| 193 m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, true); | 207 m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, true); |
| 194 } | 208 } |
| 195 | 209 |
| 196 void InspectorHeapProfilerAgent::disable(ErrorString* error) | 210 void InspectorHeapProfilerAgent::disable(ErrorString* error) |
| 197 { | 211 { |
| 198 stopTrackingHeapObjectsInternal(); | 212 stopTrackingHeapObjectsInternal(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 if (value.hasNoValue() || value.isUndefined()) { | 300 if (value.hasNoValue() || value.isUndefined()) { |
| 287 *errorString = "Object with given id not found"; | 301 *errorString = "Object with given id not found"; |
| 288 return; | 302 return; |
| 289 } | 303 } |
| 290 unsigned id = ScriptProfiler::getHeapObjectId(value); | 304 unsigned id = ScriptProfiler::getHeapObjectId(value); |
| 291 *heapSnapshotObjectId = String::number(id); | 305 *heapSnapshotObjectId = String::number(id); |
| 292 } | 306 } |
| 293 | 307 |
| 294 } // namespace WebCore | 308 } // namespace WebCore |
| 295 | 309 |
| OLD | NEW |