Chromium Code Reviews| 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 /** | 5 /** |
| 6 * @implements {SDK.SDKModelObserver<!SDK.CPUProfilerModel>} | 6 * @implements {SDK.SDKModelObserver<!SDK.CPUProfilerModel>} |
| 7 * @implements {SDK.TracingManagerClient} | 7 * @implements {SDK.TracingManagerClient} |
| 8 * @unrestricted | 8 * @unrestricted |
| 9 */ | 9 */ |
| 10 Timeline.TimelineController = class { | 10 Timeline.TimelineController = class { |
| 11 /** | 11 /** |
| 12 * @param {!SDK.Target} target | 12 * @param {!SDK.TracingManager} tracingManager |
| 13 * @param {!Timeline.PerformanceModel} performanceModel | 13 * @param {!Timeline.PerformanceModel} performanceModel |
| 14 * @param {!Timeline.TimelineController.Client} client | 14 * @param {!Timeline.TimelineController.Client} client |
| 15 */ | 15 */ |
| 16 constructor(target, performanceModel, client) { | 16 constructor(tracingManager, performanceModel, client) { |
| 17 this._target = target; | 17 this._tracingManager = tracingManager; |
| 18 this._performanceModel = performanceModel; | 18 this._performanceModel = performanceModel; |
| 19 this._client = client; | 19 this._client = client; |
| 20 | 20 |
| 21 this._tracingModelBackingStorage = new Bindings.TempFileBackingStorage('trac ing'); | 21 this._tracingModelBackingStorage = new Bindings.TempFileBackingStorage('trac ing'); |
| 22 this._tracingModel = new SDK.TracingModel(this._tracingModelBackingStorage); | 22 this._tracingModel = new SDK.TracingModel(this._tracingModelBackingStorage); |
| 23 | 23 |
| 24 this._performanceModel.setMainTarget(target); | 24 this._performanceModel.setMainTarget(tracingManager.target()); |
| 25 | 25 |
| 26 /** @type {!Array<!Timeline.ExtensionTracingSession>} */ | 26 /** @type {!Array<!Timeline.ExtensionTracingSession>} */ |
| 27 this._extensionSessions = []; | 27 this._extensionSessions = []; |
| 28 SDK.targetManager.observeModels(SDK.CPUProfilerModel, this); | 28 SDK.targetManager.observeModels(SDK.CPUProfilerModel, this); |
| 29 } | 29 } |
| 30 | 30 |
| 31 /** | 31 /** |
| 32 * @param {!Timeline.TimelineController.RecordingOptions} options | 32 * @param {!Timeline.TimelineController.RecordingOptions} options |
| 33 * @param {!Array<!Extensions.ExtensionTraceProvider>} providers | 33 * @param {!Array<!Extensions.ExtensionTraceProvider>} providers |
| 34 * @return {!Promise} | 34 * @return {!Promise} |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 this._extensionSessions.forEach(session => session.start()); | 73 this._extensionSessions.forEach(session => session.start()); |
| 74 var startPromise = this._startRecordingWithCategories(categoriesArray.join(' ,'), options.enableJSSampling); | 74 var startPromise = this._startRecordingWithCategories(categoriesArray.join(' ,'), options.enableJSSampling); |
| 75 this._performanceModel.setRecordStartTime(Date.now()); | 75 this._performanceModel.setRecordStartTime(Date.now()); |
| 76 return startPromise; | 76 return startPromise; |
| 77 } | 77 } |
| 78 | 78 |
| 79 stopRecording() { | 79 stopRecording() { |
| 80 var tracingStoppedPromises = []; | 80 var tracingStoppedPromises = []; |
| 81 tracingStoppedPromises.push(new Promise(resolve => this._tracingCompleteCall back = resolve)); | 81 tracingStoppedPromises.push(new Promise(resolve => this._tracingCompleteCall back = resolve)); |
| 82 tracingStoppedPromises.push(this._stopProfilingOnAllModels()); | 82 tracingStoppedPromises.push(this._stopProfilingOnAllModels()); |
| 83 this._target.tracingManager.stop(); | 83 this._tracingManager.stop(); |
| 84 tracingStoppedPromises.push(SDK.targetManager.resumeAllTargets()); | 84 tracingStoppedPromises.push(SDK.targetManager.resumeAllTargets()); |
| 85 | 85 |
| 86 this._client.loadingStarted(); | 86 this._client.loadingStarted(); |
| 87 | 87 |
| 88 var extensionCompletionPromises = this._extensionSessions.map(session => ses sion.stop()); | 88 var extensionCompletionPromises = this._extensionSessions.map(session => ses sion.stop()); |
| 89 if (extensionCompletionPromises.length) { | 89 if (extensionCompletionPromises.length) { |
| 90 var timerId; | 90 var timerId; |
| 91 var timeoutPromise = new Promise(fulfill => timerId = setTimeout(fulfill, 5000)); | 91 var timeoutPromise = new Promise(fulfill => timerId = setTimeout(fulfill, 5000)); |
| 92 tracingStoppedPromises.push( | 92 tracingStoppedPromises.push( |
| 93 Promise.race([Promise.all(extensionCompletionPromises).then(() => clea rTimeout(timerId)), timeoutPromise])); | 93 Promise.race([Promise.all(extensionCompletionPromises).then(() => clea rTimeout(timerId)), timeoutPromise])); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 * @param {boolean=} enableJSSampling | 156 * @param {boolean=} enableJSSampling |
| 157 * @return {!Promise} | 157 * @return {!Promise} |
| 158 */ | 158 */ |
| 159 _startRecordingWithCategories(categories, enableJSSampling) { | 159 _startRecordingWithCategories(categories, enableJSSampling) { |
| 160 SDK.targetManager.suspendAllTargets(); | 160 SDK.targetManager.suspendAllTargets(); |
| 161 var profilingStartedPromise = enableJSSampling && !Runtime.experiments.isEna bled('timelineTracingJSProfile') ? | 161 var profilingStartedPromise = enableJSSampling && !Runtime.experiments.isEna bled('timelineTracingJSProfile') ? |
| 162 this._startProfilingOnAllModels() : | 162 this._startProfilingOnAllModels() : |
| 163 Promise.resolve(); | 163 Promise.resolve(); |
| 164 var samplingFrequencyHz = Common.moduleSetting('highResolutionCpuProfiling') .get() ? 10000 : 1000; | 164 var samplingFrequencyHz = Common.moduleSetting('highResolutionCpuProfiling') .get() ? 10000 : 1000; |
| 165 var options = 'sampling-frequency=' + samplingFrequencyHz; | 165 var options = 'sampling-frequency=' + samplingFrequencyHz; |
| 166 var tracingManager = this._target.tracingManager; | 166 return profilingStartedPromise.then(() => this._tracingManager.start(this, c ategories, options)); |
| 167 return profilingStartedPromise.then(() => tracingManager.start(this, categor ies, options)); | |
| 168 } | 167 } |
| 169 | 168 |
| 170 /** | 169 /** |
| 171 * @param {!Array.<!SDK.TracingManager.EventPayload>} events | 170 * @param {!Array.<!SDK.TracingManager.EventPayload>} events |
| 172 * @override | 171 * @override |
| 173 */ | 172 */ |
| 174 traceEventsCollected(events) { | 173 traceEventsCollected(events) { |
| 175 this._tracingModel.addEvents(events); | 174 this._tracingModel.addEvents(events); |
| 176 } | 175 } |
| 177 | 176 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 219 return; | 218 return; |
| 220 | 219 |
| 221 var metadataEventTypes = TimelineModel.TimelineModel.DevToolsMetadataEvent; | 220 var metadataEventTypes = TimelineModel.TimelineModel.DevToolsMetadataEvent; |
| 222 var metadataEvents = this._tracingModel.devToolsMetadataEvents(); | 221 var metadataEvents = this._tracingModel.devToolsMetadataEvents(); |
| 223 var mainMetaEvent = | 222 var mainMetaEvent = |
| 224 metadataEvents.filter(event => event.name === metadataEventTypes.Tracing StartedInPage).peekLast(); | 223 metadataEvents.filter(event => event.name === metadataEventTypes.Tracing StartedInPage).peekLast(); |
| 225 if (!mainMetaEvent) | 224 if (!mainMetaEvent) |
| 226 return; | 225 return; |
| 227 | 226 |
| 228 var pid = mainMetaEvent.thread.process().id(); | 227 var pid = mainMetaEvent.thread.process().id(); |
| 229 var mainCpuProfile = this._cpuProfiles.get(this._target.id()); | 228 var mainCpuProfile = this._cpuProfiles.get(this._tracingManager.target().id( )); |
| 230 this._injectCpuProfileEvent(pid, mainMetaEvent.thread.id(), mainCpuProfile); | 229 this._injectCpuProfileEvent(pid, mainMetaEvent.thread.id(), mainCpuProfile); |
| 231 | 230 |
| 232 var workerMetaEvents = metadataEvents.filter(event => event.name === metadat aEventTypes.TracingSessionIdForWorker); | 231 var workerMetaEvents = metadataEvents.filter(event => event.name === metadat aEventTypes.TracingSessionIdForWorker); |
| 233 for (var metaEvent of workerMetaEvents) { | 232 for (var metaEvent of workerMetaEvents) { |
| 234 var workerId = metaEvent.args['data']['workerId']; | 233 var workerId = metaEvent.args['data']['workerId']; |
| 235 var workerTarget = SDK.targetManager.targetById(workerId); | 234 var cpuProfile = this._cpuProfiles.get(workerId); |
|
caseq
2017/03/01 02:28:06
Can we really expect that worker id in trace is sa
| |
| 236 if (!workerTarget) | |
| 237 continue; | |
| 238 var cpuProfile = this._cpuProfiles.get(workerTarget.id()); | |
| 239 this._injectCpuProfileEvent( | 235 this._injectCpuProfileEvent( |
| 240 metaEvent.thread.process().id(), metaEvent.args['data']['workerThreadI d'], cpuProfile); | 236 metaEvent.thread.process().id(), metaEvent.args['data']['workerThreadI d'], cpuProfile); |
| 241 } | 237 } |
| 242 this._cpuProfiles = null; | 238 this._cpuProfiles = null; |
| 243 } | 239 } |
| 244 | 240 |
| 245 /** | 241 /** |
| 246 * @param {number} usage | 242 * @param {number} usage |
| 247 * @override | 243 * @override |
| 248 */ | 244 */ |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 273 }; | 269 }; |
| 274 | 270 |
| 275 /** | 271 /** |
| 276 * @typedef {!{ | 272 * @typedef {!{ |
| 277 * enableJSSampling: (boolean|undefined), | 273 * enableJSSampling: (boolean|undefined), |
| 278 * capturePictures: (boolean|undefined), | 274 * capturePictures: (boolean|undefined), |
| 279 * captureFilmStrip: (boolean|undefined) | 275 * captureFilmStrip: (boolean|undefined) |
| 280 * }} | 276 * }} |
| 281 */ | 277 */ |
| 282 Timeline.TimelineController.RecordingOptions; | 278 Timeline.TimelineController.RecordingOptions; |
| OLD | NEW |