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

Unified Diff: Source/devtools/front_end/timeline/TracingTimelineModel.js

Issue 622843002: DevTools: Support timeline JS sampling for all threads. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebaseline Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/devtools/front_end/timeline/TimelineJSProfile.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/devtools/front_end/timeline/TracingTimelineModel.js
diff --git a/Source/devtools/front_end/timeline/TracingTimelineModel.js b/Source/devtools/front_end/timeline/TracingTimelineModel.js
index 52a723183a0665eb42897f1d8b5d5853bcf12acb..a89089e572fe069f942a55303ca43d96cc593f93 100644
--- a/Source/devtools/front_end/timeline/TracingTimelineModel.js
+++ b/Source/devtools/front_end/timeline/TracingTimelineModel.js
@@ -139,12 +139,8 @@ WebInspector.TracingTimelineModel.prototype = {
];
if (captureStacks) {
categoriesArray.push(disabledByDefault("devtools.timeline.stack"));
- if (Runtime.experiments.isEnabled("timelineJSCPUProfile")) {
- this._jsProfilerStarted = true;
- this._currentTarget = WebInspector.context.flavor(WebInspector.Target);
- this._configureCpuProfilerSamplingInterval();
- this._currentTarget.profilerAgent().start();
- }
+ if (Runtime.experiments.isEnabled("timelineJSCPUProfile"))
+ this._startCpuProfilingOnAllTargets();
}
if (capturePictures) {
categoriesArray = categoriesArray.concat([
@@ -158,11 +154,8 @@ WebInspector.TracingTimelineModel.prototype = {
stopRecording: function()
{
- if (this._jsProfilerStarted) {
- this._stopCallbackBarrier = new CallbackBarrier();
- this._currentTarget.profilerAgent().stop(this._stopCallbackBarrier.createCallback(this._didStopRecordingJSSamples.bind(this)));
- this._jsProfilerStarted = false;
- }
+ this._stopCallbackBarrier = new CallbackBarrier();
+ this._stopProfilingOnAllTargets();
this._tracingManager.stop();
},
@@ -176,10 +169,34 @@ WebInspector.TracingTimelineModel.prototype = {
this._onTracingComplete();
},
- _configureCpuProfilerSamplingInterval: function()
+ _startCpuProfilingOnAllTargets: function()
+ {
+ this._profilingTargets = WebInspector.targetManager.targets();
+ for (var i = 0; i < this._profilingTargets.length; ++i) {
+ var target = this._profilingTargets[i];
+ this._configureCpuProfilerSamplingInterval(target);
loislo 2014/10/10 17:13:08 what would happen when we start another worker jus
alph 2014/11/11 10:18:07 I plan to address this usecase in a separate patch
+ target.profilerAgent().start();
+ }
+ },
+
+ _stopProfilingOnAllTargets: function()
+ {
+ if (!this._profilingTargets)
+ return;
+ for (var i = 0; i < this._profilingTargets.length; ++i) {
+ var target = this._profilingTargets[i];
+ target.profilerAgent().stop(this._stopCallbackBarrier.createCallback(this._didStopRecordingJSSamples.bind(this, target)));
+ }
+ this._profilingTargets = null;
+ },
+
+ /**
+ * @param {!WebInspector.Target} target
+ */
+ _configureCpuProfilerSamplingInterval: function(target)
{
var intervalUs = WebInspector.settings.highResolutionCpuProfiling.get() ? 100 : 1000;
- this._currentTarget.profilerAgent().setSamplingInterval(intervalUs, didChangeInterval);
+ target.profilerAgent().setSamplingInterval(intervalUs, didChangeInterval);
function didChangeInterval(error)
{
@@ -214,31 +231,30 @@ WebInspector.TracingTimelineModel.prototype = {
_onTracingComplete: function()
{
- if (this._stopCallbackBarrier)
+ if (this._stopCallbackBarrier) {
loislo 2014/10/10 17:13:08 As far as I see we always have _stopCallbackBarrie
alph 2014/11/11 10:18:07 No. Tests do not call stopRecording. They use setE
this._stopCallbackBarrier.callWhenDone(this._didStopRecordingTraceEvents.bind(this));
- else
+ this._stopCallbackBarrier = null;
+ } else {
this._didStopRecordingTraceEvents();
+ }
},
/**
+ * @param {!WebInspector.Target} target
* @param {?Protocol.Error} error
* @param {?ProfilerAgent.CPUProfile} cpuProfile
*/
- _didStopRecordingJSSamples: function(error, cpuProfile)
+ _didStopRecordingJSSamples: function(target, error, cpuProfile)
{
if (error)
WebInspector.console.error(error);
- this._recordedCpuProfile = cpuProfile;
+ if (!this._cpuProfiles)
+ this._cpuProfiles = {};
+ this._cpuProfiles[target.id()] = cpuProfile;
},
_didStopRecordingTraceEvents: function()
{
- this._stopCallbackBarrier = null;
-
- if (this._recordedCpuProfile) {
- this._injectCpuProfileEvent(this._recordedCpuProfile);
- this._recordedCpuProfile = null;
- }
this._tracingModel.tracingComplete();
var events = this._tracingModel.devtoolsPageMetadataEvents();
@@ -257,7 +273,7 @@ WebInspector.TracingTimelineModel.prototype = {
var threads = process.sortedThreads();
for (var j = 0; j < threads.length; j++) {
var thread = threads[j];
- if (thread.name() === "WebCore: Worker" && !workerMetadataEvents.some(function(e) { return e.args["data"]["workerThreadId"] === thread.id(); }))
+ if (thread.name() === "WebCore: Worker" && workerMetadataEvents.every(function(e) { return e.args["data"]["workerThreadId"] !== thread.id(); }))
continue;
this._processThreadEvents(startTime, endTime, event.thread, thread);
}
@@ -266,10 +282,8 @@ WebInspector.TracingTimelineModel.prototype = {
this._inspectedTargetEvents.sort(WebInspector.TracingModel.Event.compareStartTime);
- if (this._cpuProfile) {
- this._processCpuProfile(this._cpuProfile);
- this._cpuProfile = null;
- }
+ this._cpuProfiles = null;
+
this._buildTimelineRecords();
this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordingStopped);
},
@@ -295,16 +309,6 @@ WebInspector.TracingTimelineModel.prototype = {
},
/**
- * @param {!ProfilerAgent.CPUProfile} cpuProfile
- */
- _processCpuProfile: function(cpuProfile)
- {
- var jsSamples = WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile(this, cpuProfile);
- this._inspectedTargetEvents = this._inspectedTargetEvents.mergeOrdered(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime);
- this._setMainThreadEvents(this.mainThreadEvents().mergeOrdered(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime));
- },
-
- /**
* @return {number}
*/
minimumRecordTime: function()
@@ -498,11 +502,12 @@ WebInspector.TracingTimelineModel.prototype = {
var i = events.lowerBound(startTime, function (time, event) { return time - event.startTime });
var threadEvents;
+ var virtualThread = null;
if (thread === mainThread) {
threadEvents = this._mainThreadEvents;
this._mainThreadAsyncEvents = this._mainThreadAsyncEvents.concat(thread.asyncEvents());
} else {
- var virtualThread = new WebInspector.TracingTimelineModel.VirtualThread(thread.name());
+ virtualThread = new WebInspector.TracingTimelineModel.VirtualThread(thread.name());
threadEvents = virtualThread.events;
virtualThread.asyncEvents = virtualThread.asyncEvents.concat(thread.asyncEvents());
this._virtualThreads.push(virtualThread);
@@ -517,6 +522,19 @@ WebInspector.TracingTimelineModel.prototype = {
threadEvents.push(event);
this._inspectedTargetEvents.push(event);
}
+
+ if (this._cpuProfiles) {
+ var cpuProfile = this._cpuProfiles[thread.target().id()];
+ if (cpuProfile) {
+ var jsSamples = WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile(cpuProfile, thread);
+ var mergedEvents = threadEvents.mergeOrdered(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime);
+ if (virtualThread)
+ virtualThread.events = mergedEvents;
+ else
+ this._mainThreadEvents = mergedEvents;
+ this._inspectedTargetEvents = this._inspectedTargetEvents.concat(jsSamples);
+ }
+ }
},
/**
« no previous file with comments | « Source/devtools/front_end/timeline/TimelineJSProfile.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698