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

Side by Side Diff: Source/core/inspector/InspectorTimelineAgent.cpp

Issue 214523005: DevTools: report timeline progress while recording. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 } 263 }
264 264
265 void InspectorTimelineAgent::pushGCEventRecords() 265 void InspectorTimelineAgent::pushGCEventRecords()
266 { 266 {
267 if (!m_gcEvents.size()) 267 if (!m_gcEvents.size())
268 return; 268 return;
269 269
270 GCEvents events = m_gcEvents; 270 GCEvents events = m_gcEvents;
271 m_gcEvents.clear(); 271 m_gcEvents.clear();
272 for (GCEvents::iterator i = events.begin(); i != events.end(); ++i) { 272 for (GCEvents::iterator i = events.begin(); i != events.end(); ++i) {
273 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecor d(m_timeConverter.fromMonotonicallyIncreasingTime(i->startTime), m_maxCallStackD epth, TimelineRecordType::GCEvent, TimelineRecordFactory::createGCEventData(i->c ollectedBytes)); 273 double ts = m_timeConverter.fromMonotonicallyIncreasingTime(i->startTime );
274 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecor d(ts, m_maxCallStackDepth, TimelineRecordType::GCEvent, TimelineRecordFactory::c reateGCEventData(i->collectedBytes));
274 record->setEndTime(m_timeConverter.fromMonotonicallyIncreasingTime(i->en dTime)); 275 record->setEndTime(m_timeConverter.fromMonotonicallyIncreasingTime(i->en dTime));
275 addRecordToTimeline(record.release()); 276 addRecordToTimeline(record.release(), ts);
276 } 277 }
277 } 278 }
278 279
279 void InspectorTimelineAgent::didGC(double startTime, double endTime, size_t coll ectedBytesCount) 280 void InspectorTimelineAgent::didGC(double startTime, double endTime, size_t coll ectedBytesCount)
280 { 281 {
281 m_gcEvents.append(TimelineGCEvent(startTime, endTime, collectedBytesCount)); 282 m_gcEvents.append(TimelineGCEvent(startTime, endTime, collectedBytesCount));
282 } 283 }
283 284
284 InspectorTimelineAgent::~InspectorTimelineAgent() 285 InspectorTimelineAgent::~InspectorTimelineAgent()
285 { 286 {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 *errorString = "Timeline is already started"; 338 *errorString = "Timeline is already started";
338 return; 339 return;
339 } 340 }
340 341
341 releaseNodeIds(); 342 releaseNodeIds();
342 if (maxCallStackDepth && *maxCallStackDepth >= 0) 343 if (maxCallStackDepth && *maxCallStackDepth >= 0)
343 m_maxCallStackDepth = *maxCallStackDepth; 344 m_maxCallStackDepth = *maxCallStackDepth;
344 else 345 else
345 m_maxCallStackDepth = 5; 346 m_maxCallStackDepth = 5;
346 347
347 if (bufferEvents && *bufferEvents) 348 if (bufferEvents && *bufferEvents) {
348 m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create(); 349 m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create();
350 m_lastProgressTimestamp = timestamp();
351 }
352
349 if (liveEvents) 353 if (liveEvents)
350 setLiveEvents(*liveEvents); 354 setLiveEvents(*liveEvents);
351 355
352 m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallSta ckDepth); 356 m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallSta ckDepth);
353 m_state->setBoolean(TimelineAgentState::includeCounters, includeCounters && *includeCounters); 357 m_state->setBoolean(TimelineAgentState::includeCounters, includeCounters && *includeCounters);
354 m_state->setBoolean(TimelineAgentState::includeGPUEvents, includeGPUEvents & & *includeGPUEvents); 358 m_state->setBoolean(TimelineAgentState::includeGPUEvents, includeGPUEvents & & *includeGPUEvents);
355 m_state->setBoolean(TimelineAgentState::bufferEvents, bufferEvents && *buffe rEvents); 359 m_state->setBoolean(TimelineAgentState::bufferEvents, bufferEvents && *buffe rEvents);
356 m_state->setString(TimelineAgentState::liveEvents, liveEvents ? *liveEvents : ""); 360 m_state->setString(TimelineAgentState::liveEvents, liveEvents ? *liveEvents : "");
357 361
358 innerStart(); 362 innerStart();
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 double paintSetupStart = m_paintSetupStart; 590 double paintSetupStart = m_paintSetupStart;
587 m_paintSetupStart = 0; 591 m_paintSetupStart = 0;
588 if (graphicsLayer) { 592 if (graphicsLayer) {
589 int layerIdentifier = graphicsLayer->platformLayer()->id(); 593 int layerIdentifier = graphicsLayer->platformLayer()->id();
590 int nodeIdentifier = nodeId(renderer); 594 int nodeIdentifier = nodeId(renderer);
591 ASSERT(layerIdentifier && nodeIdentifier); 595 ASSERT(layerIdentifier && nodeIdentifier);
592 m_layerToNodeMap.set(layerIdentifier, nodeIdentifier); 596 m_layerToNodeMap.set(layerIdentifier, nodeIdentifier);
593 if (paintSetupStart) { 597 if (paintSetupStart) {
594 RefPtr<TimelineEvent> paintSetupRecord = TimelineRecordFactory::crea teGenericRecord(paintSetupStart, 0, TimelineRecordType::PaintSetup, TimelineReco rdFactory::createLayerData(nodeIdentifier)); 598 RefPtr<TimelineEvent> paintSetupRecord = TimelineRecordFactory::crea teGenericRecord(paintSetupStart, 0, TimelineRecordType::PaintSetup, TimelineReco rdFactory::createLayerData(nodeIdentifier));
595 paintSetupRecord->setEndTime(m_paintSetupEnd); 599 paintSetupRecord->setEndTime(m_paintSetupEnd);
596 addRecordToTimeline(paintSetupRecord); 600 addRecordToTimeline(paintSetupRecord, paintSetupStart);
597 } 601 }
598 } 602 }
599 pushCurrentRecord(JSONObject::create(), TimelineRecordType::Paint, true, fra me, true); 603 pushCurrentRecord(JSONObject::create(), TimelineRecordType::Paint, true, fra me, true);
600 } 604 }
601 605
602 void InspectorTimelineAgent::didPaint(RenderObject* renderer, const GraphicsLaye r* graphicsLayer, GraphicsContext*, const LayoutRect& clipRect) 606 void InspectorTimelineAgent::didPaint(RenderObject* renderer, const GraphicsLaye r* graphicsLayer, GraphicsContext*, const LayoutRect& clipRect)
603 { 607 {
604 TimelineRecordEntry& entry = m_recordStack.last(); 608 TimelineRecordEntry& entry = m_recordStack.last();
605 ASSERT(entry.type == TimelineRecordType::Paint); 609 ASSERT(entry.type == TimelineRecordType::Paint);
606 FloatQuad quad; 610 FloatQuad quad;
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ti mestamp, 0, TimelineRecordType::EmbedderCallback, data); 1090 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ti mestamp, 0, TimelineRecordType::EmbedderCallback, data);
1087 state.recordStack.addScopedRecord(record, TimelineRecordType::EmbedderCallba ck); 1091 state.recordStack.addScopedRecord(record, TimelineRecordType::EmbedderCallba ck);
1088 } 1092 }
1089 1093
1090 void InspectorTimelineAgent::onEmbedderCallbackEnd(const TraceEventDispatcher::T raceEvent& event) 1094 void InspectorTimelineAgent::onEmbedderCallbackEnd(const TraceEventDispatcher::T raceEvent& event)
1091 { 1095 {
1092 TimelineThreadState& state = threadState(event.threadIdentifier()); 1096 TimelineThreadState& state = threadState(event.threadIdentifier());
1093 state.recordStack.closeScopedRecord(m_timeConverter.fromMonotonicallyIncreas ingTime(event.timestamp())); 1097 state.recordStack.closeScopedRecord(m_timeConverter.fromMonotonicallyIncreas ingTime(event.timestamp()));
1094 } 1098 }
1095 1099
1096 void InspectorTimelineAgent::addRecordToTimeline(PassRefPtr<TimelineEvent> recor d) 1100 void InspectorTimelineAgent::addRecordToTimeline(PassRefPtr<TimelineEvent> recor d, double ts)
1097 { 1101 {
1098 commitFrameRecord(); 1102 commitFrameRecord();
1099 innerAddRecordToTimeline(record); 1103 innerAddRecordToTimeline(record);
1104 if (m_bufferedEvents && ts - m_lastProgressTimestamp > 300) {
1105 m_lastProgressTimestamp = ts;
1106 m_frontend->progress(m_bufferedEvents->length());
1107 }
1100 } 1108 }
1101 1109
1102 void InspectorTimelineAgent::innerAddRecordToTimeline(PassRefPtr<TimelineEvent> record) 1110 void InspectorTimelineAgent::innerAddRecordToTimeline(PassRefPtr<TimelineEvent> record)
1103 { 1111 {
1104 if (m_recordStack.isEmpty()) { 1112 if (m_recordStack.isEmpty()) {
1105 TraceEventDispatcher::instance()->processBackgroundEvents(); 1113 TraceEventDispatcher::instance()->processBackgroundEvents();
1106 sendEvent(record); 1114 sendEvent(record);
1107 } else { 1115 } else {
1108 setCounters(record.get()); 1116 setCounters(record.get());
1109 TimelineRecordEntry& parent = m_recordStack.last(); 1117 TimelineRecordEntry& parent = m_recordStack.last();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1163 m_recordStack.removeLast(); 1171 m_recordStack.removeLast();
1164 while (entry.type != type && entry.skipWhenUnbalanced && !m_recordStack. isEmpty()) { 1172 while (entry.type != type && entry.skipWhenUnbalanced && !m_recordStack. isEmpty()) {
1165 // Discard pending skippable entry, paste its children inplace. 1173 // Discard pending skippable entry, paste its children inplace.
1166 if (entry.children) 1174 if (entry.children)
1167 m_recordStack.last().children->concat(entry.children); 1175 m_recordStack.last().children->concat(entry.children);
1168 entry = m_recordStack.last(); 1176 entry = m_recordStack.last();
1169 m_recordStack.removeLast(); 1177 m_recordStack.removeLast();
1170 } 1178 }
1171 ASSERT(entry.type == type); 1179 ASSERT(entry.type == type);
1172 entry.record->setChildren(entry.children); 1180 entry.record->setChildren(entry.children);
1173 entry.record->setEndTime(timestamp()); 1181 double ts = timestamp();
1182 entry.record->setEndTime(ts);
1174 ptrdiff_t usedHeapSizeDelta = getUsedHeapSize() - entry.usedHeapSizeAtSt art; 1183 ptrdiff_t usedHeapSizeDelta = getUsedHeapSize() - entry.usedHeapSizeAtSt art;
1175 if (usedHeapSizeDelta) 1184 if (usedHeapSizeDelta)
1176 entry.record->setUsedHeapSizeDelta(usedHeapSizeDelta); 1185 entry.record->setUsedHeapSizeDelta(usedHeapSizeDelta);
1177 addRecordToTimeline(entry.record); 1186 addRecordToTimeline(entry.record, ts);
1178 } 1187 }
1179 } 1188 }
1180 1189
1181 void InspectorTimelineAgent::unwindRecordStack() 1190 void InspectorTimelineAgent::unwindRecordStack()
1182 { 1191 {
1183 while (!m_recordStack.isEmpty()) { 1192 while (!m_recordStack.isEmpty()) {
1184 TimelineRecordEntry& entry = m_recordStack.last(); 1193 TimelineRecordEntry& entry = m_recordStack.last();
1185 didCompleteCurrentRecord(entry.type); 1194 didCompleteCurrentRecord(entry.type);
1186 } 1195 }
1187 } 1196 }
1188 1197
1189 InspectorTimelineAgent::InspectorTimelineAgent(InspectorPageAgent* pageAgent, In spectorDOMAgent* domAgent, InspectorLayerTreeAgent* layerTreeAgent, 1198 InspectorTimelineAgent::InspectorTimelineAgent(InspectorPageAgent* pageAgent, In spectorDOMAgent* domAgent, InspectorLayerTreeAgent* layerTreeAgent,
1190 InspectorOverlay* overlay, InspectorType type, InspectorClient* client) 1199 InspectorOverlay* overlay, InspectorType type, InspectorClient* client)
1191 : InspectorBaseAgent<InspectorTimelineAgent>("Timeline") 1200 : InspectorBaseAgent<InspectorTimelineAgent>("Timeline")
1192 , m_pageAgent(pageAgent) 1201 , m_pageAgent(pageAgent)
1193 , m_domAgent(domAgent) 1202 , m_domAgent(domAgent)
1194 , m_layerTreeAgent(layerTreeAgent) 1203 , m_layerTreeAgent(layerTreeAgent)
1195 , m_frontend(0) 1204 , m_frontend(0)
1196 , m_client(client) 1205 , m_client(client)
1197 , m_overlay(overlay) 1206 , m_overlay(overlay)
1198 , m_inspectorType(type) 1207 , m_inspectorType(type)
1199 , m_id(1) 1208 , m_id(1)
1200 , m_layerTreeId(0) 1209 , m_layerTreeId(0)
1201 , m_maxCallStackDepth(5) 1210 , m_maxCallStackDepth(5)
1202 , m_platformInstrumentationClientInstalledAtStackDepth(0) 1211 , m_platformInstrumentationClientInstalledAtStackDepth(0)
1203 , m_imageBeingPainted(0) 1212 , m_imageBeingPainted(0)
1204 , m_paintSetupStart(0) 1213 , m_paintSetupStart(0)
1205 , m_styleRecalcElementCounter(0) 1214 , m_styleRecalcElementCounter(0)
1206 , m_mayEmitFirstPaint(false) 1215 , m_mayEmitFirstPaint(false)
1216 , m_lastProgressTimestamp(0)
1207 { 1217 {
1208 } 1218 }
1209 1219
1210 void InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const Str ing& type, bool captureCallStack, LocalFrame* frame) 1220 void InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const Str ing& type, bool captureCallStack, LocalFrame* frame)
1211 { 1221 {
1212 pushGCEventRecords(); 1222 pushGCEventRecords();
1213 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ti mestamp(), captureCallStack ? m_maxCallStackDepth : 0, type, data); 1223 double ts = timestamp();
1224 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ts , captureCallStack ? m_maxCallStackDepth : 0, type, data);
1214 setFrameIdentifier(record.get(), frame); 1225 setFrameIdentifier(record.get(), frame);
1215 addRecordToTimeline(record.release()); 1226 addRecordToTimeline(record.release(), ts);
1216 } 1227 }
1217 1228
1218 void InspectorTimelineAgent::sendEvent(PassRefPtr<TimelineEvent> record) 1229 void InspectorTimelineAgent::sendEvent(PassRefPtr<TimelineEvent> record)
1219 { 1230 {
1220 RefPtr<TimelineEvent> retain = record; 1231 RefPtr<TimelineEvent> retain = record;
1221 if (m_bufferedEvents) { 1232 if (m_bufferedEvents) {
1222 m_bufferedEvents->addItem(retain); 1233 m_bufferedEvents->addItem(retain);
1223 if (!m_liveEvents.contains(TimelineRecordFactory::type(retain.get()))) 1234 if (!m_liveEvents.contains(TimelineRecordFactory::type(retain.get())))
1224 return; 1235 return;
1225 } 1236 }
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 1365
1355 #ifndef NDEBUG 1366 #ifndef NDEBUG
1356 bool TimelineRecordStack::isOpenRecordOfType(const String& type) 1367 bool TimelineRecordStack::isOpenRecordOfType(const String& type)
1357 { 1368 {
1358 return !m_stack.isEmpty() && m_stack.last().type == type; 1369 return !m_stack.isEmpty() && m_stack.last().type == type;
1359 } 1370 }
1360 #endif 1371 #endif
1361 1372
1362 } // namespace WebCore 1373 } // namespace WebCore
1363 1374
OLDNEW
« no previous file with comments | « Source/core/inspector/InspectorTimelineAgent.h ('k') | Source/devtools/front_end/CPUProfileView.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698