| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/v8_inspector/V8HeapProfilerAgentImpl.h" | 5 #include "platform/v8_inspector/V8HeapProfilerAgentImpl.h" |
| 6 | 6 |
| 7 #include "platform/v8_inspector/InjectedScript.h" | 7 #include "platform/v8_inspector/InjectedScript.h" |
| 8 #include "platform/v8_inspector/V8DebuggerImpl.h" | 8 #include "platform/v8_inspector/V8DebuggerImpl.h" |
| 9 #include "platform/v8_inspector/V8InspectorSessionImpl.h" | 9 #include "platform/v8_inspector/V8InspectorSessionImpl.h" |
| 10 #include "platform/v8_inspector/V8StringUtil.h" | 10 #include "platform/v8_inspector/V8StringUtil.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 m_frontend->heapStatsUpdate(std::move(statsDiff)); | 142 m_frontend->heapStatsUpdate(std::move(statsDiff)); |
| 143 return kContinue; | 143 return kContinue; |
| 144 } | 144 } |
| 145 | 145 |
| 146 private: | 146 private: |
| 147 protocol::HeapProfiler::Frontend* m_frontend; | 147 protocol::HeapProfiler::Frontend* m_frontend; |
| 148 }; | 148 }; |
| 149 | 149 |
| 150 } // namespace | 150 } // namespace |
| 151 | 151 |
| 152 V8HeapProfilerAgentImpl::V8HeapProfilerAgentImpl(V8InspectorSessionImpl* session
, protocol::HeapProfiler::Frontend* frontend, protocol::DictionaryValue* state) | 152 V8HeapProfilerAgentImpl::V8HeapProfilerAgentImpl(V8InspectorSessionImpl* session
, protocol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state) |
| 153 : m_session(session) | 153 : m_session(session) |
| 154 , m_isolate(session->debugger()->isolate()) | 154 , m_isolate(session->debugger()->isolate()) |
| 155 , m_frontend(frontend) | 155 , m_frontend(frontendChannel) |
| 156 , m_state(state) | 156 , m_state(state) |
| 157 , m_hasTimer(false) | 157 , m_hasTimer(false) |
| 158 { | 158 { |
| 159 } | 159 } |
| 160 | 160 |
| 161 V8HeapProfilerAgentImpl::~V8HeapProfilerAgentImpl() | 161 V8HeapProfilerAgentImpl::~V8HeapProfilerAgentImpl() |
| 162 { | 162 { |
| 163 } | 163 } |
| 164 | 164 |
| 165 void V8HeapProfilerAgentImpl::restore() | 165 void V8HeapProfilerAgentImpl::restore() |
| 166 { | 166 { |
| 167 if (m_state->booleanProperty(HeapProfilerAgentState::heapProfilerEnabled, fa
lse)) | 167 if (m_state->booleanProperty(HeapProfilerAgentState::heapProfilerEnabled, fa
lse)) |
| 168 m_frontend->resetProfiles(); | 168 m_frontend.resetProfiles(); |
| 169 if (m_state->booleanProperty(HeapProfilerAgentState::heapObjectsTrackingEnab
led, false)) | 169 if (m_state->booleanProperty(HeapProfilerAgentState::heapObjectsTrackingEnab
led, false)) |
| 170 startTrackingHeapObjectsInternal(m_state->booleanProperty(HeapProfilerAg
entState::allocationTrackingEnabled, false)); | 170 startTrackingHeapObjectsInternal(m_state->booleanProperty(HeapProfilerAg
entState::allocationTrackingEnabled, false)); |
| 171 #if V8_MAJOR_VERSION >= 5 | 171 #if V8_MAJOR_VERSION >= 5 |
| 172 if (m_state->booleanProperty(HeapProfilerAgentState::samplingHeapProfilerEna
bled, false)) { | 172 if (m_state->booleanProperty(HeapProfilerAgentState::samplingHeapProfilerEna
bled, false)) { |
| 173 ErrorString error; | 173 ErrorString error; |
| 174 double samplingInterval = m_state->numberProperty(HeapProfilerAgentState
::samplingHeapProfilerInterval, -1); | 174 double samplingInterval = m_state->numberProperty(HeapProfilerAgentState
::samplingHeapProfilerInterval, -1); |
| 175 DCHECK_GE(samplingInterval, 0); | 175 DCHECK_GE(samplingInterval, 0); |
| 176 startSampling(&error, Maybe<double>(samplingInterval)); | 176 startSampling(&error, Maybe<double>(samplingInterval)); |
| 177 } | 177 } |
| 178 #endif | 178 #endif |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 | 219 |
| 220 void V8HeapProfilerAgentImpl::takeHeapSnapshot(ErrorString* errorString, const p
rotocol::Maybe<bool>& reportProgress) | 220 void V8HeapProfilerAgentImpl::takeHeapSnapshot(ErrorString* errorString, const p
rotocol::Maybe<bool>& reportProgress) |
| 221 { | 221 { |
| 222 v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); | 222 v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); |
| 223 if (!profiler) { | 223 if (!profiler) { |
| 224 *errorString = "Cannot access v8 heap profiler"; | 224 *errorString = "Cannot access v8 heap profiler"; |
| 225 return; | 225 return; |
| 226 } | 226 } |
| 227 std::unique_ptr<HeapSnapshotProgress> progress; | 227 std::unique_ptr<HeapSnapshotProgress> progress; |
| 228 if (reportProgress.fromMaybe(false)) | 228 if (reportProgress.fromMaybe(false)) |
| 229 progress = wrapUnique(new HeapSnapshotProgress(m_frontend)); | 229 progress = wrapUnique(new HeapSnapshotProgress(&m_frontend)); |
| 230 | 230 |
| 231 GlobalObjectNameResolver resolver(m_session); | 231 GlobalObjectNameResolver resolver(m_session); |
| 232 const v8::HeapSnapshot* snapshot = profiler->TakeHeapSnapshot(progress.get()
, &resolver); | 232 const v8::HeapSnapshot* snapshot = profiler->TakeHeapSnapshot(progress.get()
, &resolver); |
| 233 if (!snapshot) { | 233 if (!snapshot) { |
| 234 *errorString = "Failed to take heap snapshot"; | 234 *errorString = "Failed to take heap snapshot"; |
| 235 return; | 235 return; |
| 236 } | 236 } |
| 237 HeapSnapshotOutputStream stream(m_frontend); | 237 HeapSnapshotOutputStream stream(&m_frontend); |
| 238 snapshot->Serialize(&stream); | 238 snapshot->Serialize(&stream); |
| 239 const_cast<v8::HeapSnapshot*>(snapshot)->Delete(); | 239 const_cast<v8::HeapSnapshot*>(snapshot)->Delete(); |
| 240 } | 240 } |
| 241 | 241 |
| 242 void V8HeapProfilerAgentImpl::getObjectByHeapObjectId(ErrorString* error, const
String16& heapSnapshotObjectId, const protocol::Maybe<String16>& objectGroup, st
d::unique_ptr<protocol::Runtime::RemoteObject>* result) | 242 void V8HeapProfilerAgentImpl::getObjectByHeapObjectId(ErrorString* error, const
String16& heapSnapshotObjectId, const protocol::Maybe<String16>& objectGroup, st
d::unique_ptr<protocol::Runtime::RemoteObject>* result) |
| 243 { | 243 { |
| 244 bool ok; | 244 bool ok; |
| 245 int id = heapSnapshotObjectId.toInt(&ok); | 245 int id = heapSnapshotObjectId.toInt(&ok); |
| 246 if (!ok) { | 246 if (!ok) { |
| 247 *error = "Invalid heap snapshot object id"; | 247 *error = "Invalid heap snapshot object id"; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 v8::Local<v8::Value> value = m_session->findObject(errorString, objectId); | 295 v8::Local<v8::Value> value = m_session->findObject(errorString, objectId); |
| 296 if (value.IsEmpty() || value->IsUndefined()) | 296 if (value.IsEmpty() || value->IsUndefined()) |
| 297 return; | 297 return; |
| 298 | 298 |
| 299 v8::SnapshotObjectId id = m_isolate->GetHeapProfiler()->GetObjectId(value); | 299 v8::SnapshotObjectId id = m_isolate->GetHeapProfiler()->GetObjectId(value); |
| 300 *heapSnapshotObjectId = String16::number(id); | 300 *heapSnapshotObjectId = String16::number(id); |
| 301 } | 301 } |
| 302 | 302 |
| 303 void V8HeapProfilerAgentImpl::requestHeapStatsUpdate() | 303 void V8HeapProfilerAgentImpl::requestHeapStatsUpdate() |
| 304 { | 304 { |
| 305 if (!m_frontend) | 305 HeapStatsStream stream(&m_frontend); |
| 306 return; | |
| 307 HeapStatsStream stream(m_frontend); | |
| 308 v8::SnapshotObjectId lastSeenObjectId = m_isolate->GetHeapProfiler()->GetHea
pStats(&stream); | 306 v8::SnapshotObjectId lastSeenObjectId = m_isolate->GetHeapProfiler()->GetHea
pStats(&stream); |
| 309 m_frontend->lastSeenObjectId(lastSeenObjectId, m_session->debugger()->client
()->currentTimeMS()); | 307 m_frontend.lastSeenObjectId(lastSeenObjectId, m_session->debugger()->client(
)->currentTimeMS()); |
| 310 } | 308 } |
| 311 | 309 |
| 312 // static | 310 // static |
| 313 void V8HeapProfilerAgentImpl::onTimer(void* data) | 311 void V8HeapProfilerAgentImpl::onTimer(void* data) |
| 314 { | 312 { |
| 315 reinterpret_cast<V8HeapProfilerAgentImpl*>(data)->requestHeapStatsUpdate(); | 313 reinterpret_cast<V8HeapProfilerAgentImpl*>(data)->requestHeapStatsUpdate(); |
| 316 } | 314 } |
| 317 | 315 |
| 318 void V8HeapProfilerAgentImpl::startTrackingHeapObjectsInternal(bool trackAllocat
ions) | 316 void V8HeapProfilerAgentImpl::startTrackingHeapObjectsInternal(bool trackAllocat
ions) |
| 319 { | 317 { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 *errorString = "Cannot access v8 sampled heap profile."; | 392 *errorString = "Cannot access v8 sampled heap profile."; |
| 395 return; | 393 return; |
| 396 } | 394 } |
| 397 v8::AllocationProfile::Node* root = v8Profile->GetRootNode(); | 395 v8::AllocationProfile::Node* root = v8Profile->GetRootNode(); |
| 398 *profile = protocol::HeapProfiler::SamplingHeapProfile::create() | 396 *profile = protocol::HeapProfiler::SamplingHeapProfile::create() |
| 399 .setHead(buildSampingHeapProfileNode(root)).build(); | 397 .setHead(buildSampingHeapProfileNode(root)).build(); |
| 400 #endif | 398 #endif |
| 401 } | 399 } |
| 402 | 400 |
| 403 } // namespace blink | 401 } // namespace blink |
| OLD | NEW |