Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: third_party/WebKit/Source/platform/v8_inspector/V8ProfilerAgentImpl.cpp

Issue 2279513002: DevTools: make hitCount optional & experimental in Profiler domain. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/V8ProfilerAgentImpl.h" 5 #include "platform/v8_inspector/V8ProfilerAgentImpl.h"
6 6
7 #include "platform/v8_inspector/Atomics.h" 7 #include "platform/v8_inspector/Atomics.h"
8 #include "platform/v8_inspector/V8InspectorImpl.h" 8 #include "platform/v8_inspector/V8InspectorImpl.h"
9 #include "platform/v8_inspector/V8InspectorSessionImpl.h" 9 #include "platform/v8_inspector/V8InspectorSessionImpl.h"
10 #include "platform/v8_inspector/V8StackTraceImpl.h" 10 #include "platform/v8_inspector/V8StackTraceImpl.h"
(...skipping 26 matching lines...) Expand all
37 for (unsigned i = 0; i < lineCount; i++) { 37 for (unsigned i = 0; i < lineCount; i++) {
38 std::unique_ptr<protocol::Profiler::PositionTickInfo> line = protoco l::Profiler::PositionTickInfo::create() 38 std::unique_ptr<protocol::Profiler::PositionTickInfo> line = protoco l::Profiler::PositionTickInfo::create()
39 .setLine(entries[i].line) 39 .setLine(entries[i].line)
40 .setTicks(entries[i].hit_count).build(); 40 .setTicks(entries[i].hit_count).build();
41 array->addItem(std::move(line)); 41 array->addItem(std::move(line));
42 } 42 }
43 } 43 }
44 return array; 44 return array;
45 } 45 }
46 46
47 std::unique_ptr<protocol::Profiler::CPUProfileNode> buildInspectorObjectFor(v8:: Isolate* isolate, const v8::CpuProfileNode* node) 47 std::unique_ptr<protocol::Profiler::ProfileNode> buildInspectorObjectFor(v8::Iso late* isolate, const v8::CpuProfileNode* node)
48 { 48 {
49 v8::HandleScope handleScope(isolate); 49 v8::HandleScope handleScope(isolate);
50 auto callFrame = protocol::Runtime::CallFrame::create() 50 auto callFrame = protocol::Runtime::CallFrame::create()
51 .setFunctionName(toProtocolString(node->GetFunctionName())) 51 .setFunctionName(toProtocolString(node->GetFunctionName()))
52 .setScriptId(String16::fromInteger(node->GetScriptId())) 52 .setScriptId(String16::fromInteger(node->GetScriptId()))
53 .setUrl(toProtocolString(node->GetScriptResourceName())) 53 .setUrl(toProtocolString(node->GetScriptResourceName()))
54 .setLineNumber(node->GetLineNumber() - 1) 54 .setLineNumber(node->GetLineNumber() - 1)
55 .setColumnNumber(node->GetColumnNumber() - 1) 55 .setColumnNumber(node->GetColumnNumber() - 1)
56 .build(); 56 .build();
57 auto result = protocol::Profiler::CPUProfileNode::create() 57 auto result = protocol::Profiler::ProfileNode::create()
58 .setCallFrame(std::move(callFrame)) 58 .setCallFrame(std::move(callFrame))
59 .setHitCount(node->GetHitCount()) 59 .setHitCount(node->GetHitCount())
60 .setId(node->GetNodeId()).build(); 60 .setId(node->GetNodeId()).build();
61 61
62 const int childrenCount = node->GetChildrenCount(); 62 const int childrenCount = node->GetChildrenCount();
63 if (childrenCount) { 63 if (childrenCount) {
64 auto children = protocol::Array<int>::create(); 64 auto children = protocol::Array<int>::create();
65 for (int i = 0; i < childrenCount; i++) 65 for (int i = 0; i < childrenCount; i++)
66 children->addItem(node->GetChild(i)->GetNodeId()); 66 children->addItem(node->GetChild(i)->GetNodeId());
67 result->setChildren(std::move(children)); 67 result->setChildren(std::move(children));
(...skipping 25 matching lines...) Expand all
93 int count = v8profile->GetSamplesCount(); 93 int count = v8profile->GetSamplesCount();
94 uint64_t lastTime = v8profile->GetStartTime(); 94 uint64_t lastTime = v8profile->GetStartTime();
95 for (int i = 0; i < count; i++) { 95 for (int i = 0; i < count; i++) {
96 uint64_t ts = v8profile->GetSampleTimestamp(i); 96 uint64_t ts = v8profile->GetSampleTimestamp(i);
97 array->addItem(static_cast<int>(ts - lastTime)); 97 array->addItem(static_cast<int>(ts - lastTime));
98 lastTime = ts; 98 lastTime = ts;
99 } 99 }
100 return array; 100 return array;
101 } 101 }
102 102
103 void flattenNodesTree(v8::Isolate* isolate, const v8::CpuProfileNode* node, prot ocol::Array<protocol::Profiler::CPUProfileNode>* list) 103 void flattenNodesTree(v8::Isolate* isolate, const v8::CpuProfileNode* node, prot ocol::Array<protocol::Profiler::ProfileNode>* list)
104 { 104 {
105 list->addItem(buildInspectorObjectFor(isolate, node)); 105 list->addItem(buildInspectorObjectFor(isolate, node));
106 const int childrenCount = node->GetChildrenCount(); 106 const int childrenCount = node->GetChildrenCount();
107 for (int i = 0; i < childrenCount; i++) 107 for (int i = 0; i < childrenCount; i++)
108 flattenNodesTree(isolate, node->GetChild(i), list); 108 flattenNodesTree(isolate, node->GetChild(i), list);
109 } 109 }
110 110
111 std::unique_ptr<protocol::Profiler::CPUProfile> createCPUProfile(v8::Isolate* is olate, v8::CpuProfile* v8profile) 111 std::unique_ptr<protocol::Profiler::Profile> createCPUProfile(v8::Isolate* isola te, v8::CpuProfile* v8profile)
112 { 112 {
113 auto nodes = protocol::Array<protocol::Profiler::CPUProfileNode>::create(); 113 auto nodes = protocol::Array<protocol::Profiler::ProfileNode>::create();
114 flattenNodesTree(isolate, v8profile->GetTopDownRoot(), nodes.get()); 114 flattenNodesTree(isolate, v8profile->GetTopDownRoot(), nodes.get());
115 115 return protocol::Profiler::Profile::create()
116 auto profile = protocol::Profiler::CPUProfile::create()
117 .setNodes(std::move(nodes)) 116 .setNodes(std::move(nodes))
118 .setStartTime(static_cast<double>(v8profile->GetStartTime())) 117 .setStartTime(static_cast<double>(v8profile->GetStartTime()))
119 .setEndTime(static_cast<double>(v8profile->GetEndTime())).build(); 118 .setEndTime(static_cast<double>(v8profile->GetEndTime()))
120 profile->setSamples(buildInspectorObjectForSamples(v8profile)); 119 .setSamples(buildInspectorObjectForSamples(v8profile))
121 profile->setTimestampDeltas(buildInspectorObjectForTimestamps(v8profile)); 120 .setTimeDeltas(buildInspectorObjectForTimestamps(v8profile)).build();
122 return profile;
123 } 121 }
124 122
125 std::unique_ptr<protocol::Debugger::Location> currentDebugLocation(V8InspectorIm pl* inspector) 123 std::unique_ptr<protocol::Debugger::Location> currentDebugLocation(V8InspectorIm pl* inspector)
126 { 124 {
127 std::unique_ptr<V8StackTrace> callStack = inspector->captureStackTrace(1); 125 std::unique_ptr<V8StackTrace> callStack = inspector->captureStackTrace(1);
128 auto location = protocol::Debugger::Location::create() 126 auto location = protocol::Debugger::Location::create()
129 .setScriptId(callStack->topScriptId()) 127 .setScriptId(callStack->topScriptId())
130 .setLineNumber(callStack->topLineNumber()).build(); 128 .setLineNumber(callStack->topLineNumber()).build();
131 location->setColumnNumber(callStack->topColumnNumber()); 129 location->setColumnNumber(callStack->topColumnNumber());
132 return location; 130 return location;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 if (m_startedProfiles[i].m_title == title) { 190 if (m_startedProfiles[i].m_title == title) {
193 resolvedTitle = title; 191 resolvedTitle = title;
194 id = m_startedProfiles[i].m_id; 192 id = m_startedProfiles[i].m_id;
195 m_startedProfiles.erase(m_startedProfiles.begin() + i); 193 m_startedProfiles.erase(m_startedProfiles.begin() + i);
196 break; 194 break;
197 } 195 }
198 } 196 }
199 if (id.isEmpty()) 197 if (id.isEmpty())
200 return; 198 return;
201 } 199 }
202 std::unique_ptr<protocol::Profiler::CPUProfile> profile = stopProfiling(id, true); 200 std::unique_ptr<protocol::Profiler::Profile> profile = stopProfiling(id, tru e);
203 if (!profile) 201 if (!profile)
204 return; 202 return;
205 std::unique_ptr<protocol::Debugger::Location> location = currentDebugLocatio n(m_session->inspector()); 203 std::unique_ptr<protocol::Debugger::Location> location = currentDebugLocatio n(m_session->inspector());
206 m_frontend.consoleProfileFinished(id, std::move(location), std::move(profile ), resolvedTitle); 204 m_frontend.consoleProfileFinished(id, std::move(location), std::move(profile ), resolvedTitle);
207 } 205 }
208 206
209 void V8ProfilerAgentImpl::enable(ErrorString*) 207 void V8ProfilerAgentImpl::enable(ErrorString*)
210 { 208 {
211 if (m_enabled) 209 if (m_enabled)
212 return; 210 return;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 if (!m_enabled) { 269 if (!m_enabled) {
272 *error = "Profiler is not enabled"; 270 *error = "Profiler is not enabled";
273 return; 271 return;
274 } 272 }
275 m_recordingCPUProfile = true; 273 m_recordingCPUProfile = true;
276 m_frontendInitiatedProfileId = nextProfileId(); 274 m_frontendInitiatedProfileId = nextProfileId();
277 startProfiling(m_frontendInitiatedProfileId); 275 startProfiling(m_frontendInitiatedProfileId);
278 m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true); 276 m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true);
279 } 277 }
280 278
281 void V8ProfilerAgentImpl::stop(ErrorString* errorString, std::unique_ptr<protoco l::Profiler::CPUProfile>* profile) 279 void V8ProfilerAgentImpl::stop(ErrorString* errorString, std::unique_ptr<protoco l::Profiler::Profile>* profile)
282 { 280 {
283 if (!m_recordingCPUProfile) { 281 if (!m_recordingCPUProfile) {
284 if (errorString) 282 if (errorString)
285 *errorString = "No recording profiles found"; 283 *errorString = "No recording profiles found";
286 return; 284 return;
287 } 285 }
288 m_recordingCPUProfile = false; 286 m_recordingCPUProfile = false;
289 std::unique_ptr<protocol::Profiler::CPUProfile> cpuProfile = stopProfiling(m _frontendInitiatedProfileId, !!profile); 287 std::unique_ptr<protocol::Profiler::Profile> cpuProfile = stopProfiling(m_fr ontendInitiatedProfileId, !!profile);
290 if (profile) { 288 if (profile) {
291 *profile = std::move(cpuProfile); 289 *profile = std::move(cpuProfile);
292 if (!profile->get() && errorString) 290 if (!profile->get() && errorString)
293 *errorString = "Profile is not found"; 291 *errorString = "Profile is not found";
294 } 292 }
295 m_frontendInitiatedProfileId = String16(); 293 m_frontendInitiatedProfileId = String16();
296 m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false); 294 m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false);
297 } 295 }
298 296
299 String16 V8ProfilerAgentImpl::nextProfileId() 297 String16 V8ProfilerAgentImpl::nextProfileId()
300 { 298 {
301 return String16::fromInteger(atomicIncrement(&s_lastProfileId)); 299 return String16::fromInteger(atomicIncrement(&s_lastProfileId));
302 } 300 }
303 301
304 void V8ProfilerAgentImpl::startProfiling(const String16& title) 302 void V8ProfilerAgentImpl::startProfiling(const String16& title)
305 { 303 {
306 v8::HandleScope handleScope(m_isolate); 304 v8::HandleScope handleScope(m_isolate);
307 profiler()->StartProfiling(toV8String(m_isolate, title), true); 305 profiler()->StartProfiling(toV8String(m_isolate, title), true);
308 } 306 }
309 307
310 std::unique_ptr<protocol::Profiler::CPUProfile> V8ProfilerAgentImpl::stopProfili ng(const String16& title, bool serialize) 308 std::unique_ptr<protocol::Profiler::Profile> V8ProfilerAgentImpl::stopProfiling( const String16& title, bool serialize)
311 { 309 {
312 v8::HandleScope handleScope(m_isolate); 310 v8::HandleScope handleScope(m_isolate);
313 v8::CpuProfile* profile = profiler()->StopProfiling(toV8String(m_isolate, ti tle)); 311 v8::CpuProfile* profile = profiler()->StopProfiling(toV8String(m_isolate, ti tle));
314 if (!profile) 312 if (!profile)
315 return nullptr; 313 return nullptr;
316 std::unique_ptr<protocol::Profiler::CPUProfile> result; 314 std::unique_ptr<protocol::Profiler::Profile> result;
317 if (serialize) 315 if (serialize)
318 result = createCPUProfile(m_isolate, profile); 316 result = createCPUProfile(m_isolate, profile);
319 profile->Delete(); 317 profile->Delete();
320 return result; 318 return result;
321 } 319 }
322 320
323 bool V8ProfilerAgentImpl::isRecording() const 321 bool V8ProfilerAgentImpl::isRecording() const
324 { 322 {
325 return m_recordingCPUProfile || !m_startedProfiles.empty(); 323 return m_recordingCPUProfile || !m_startedProfiles.empty();
326 } 324 }
327 325
328 v8::CpuProfiler* V8ProfilerAgentImpl::profiler() 326 v8::CpuProfiler* V8ProfilerAgentImpl::profiler()
329 { 327 {
330 #if ENSURE_V8_VERSION(5, 4) 328 #if ENSURE_V8_VERSION(5, 4)
331 return m_profiler; 329 return m_profiler;
332 #else 330 #else
333 return m_isolate->GetCpuProfiler(); 331 return m_isolate->GetCpuProfiler();
334 #endif 332 #endif
335 } 333 }
336 334
337 } // namespace v8_inspector 335 } // namespace v8_inspector
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698