| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 library cpu_profile_element; | 5 library cpu_profile_element; | 
| 6 | 6 | 
| 7 import 'dart:async'; | 7 import 'dart:async'; | 
| 8 import 'dart:html'; | 8 import 'dart:html'; | 
| 9 import 'observatory_element.dart'; | 9 import 'observatory_element.dart'; | 
| 10 import 'package:observatory/service.dart'; | 10 import 'package:observatory/service.dart'; | 
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 458   final CpuProfile profile = new CpuProfile(); | 458   final CpuProfile profile = new CpuProfile(); | 
| 459 | 459 | 
| 460   CpuProfileElement.created() : super.created(); | 460   CpuProfileElement.created() : super.created(); | 
| 461 | 461 | 
| 462   @override | 462   @override | 
| 463   void attached() { | 463   void attached() { | 
| 464     super.attached(); | 464     super.attached(); | 
| 465   } | 465   } | 
| 466 | 466 | 
| 467   void isolateChanged(oldValue) { | 467   void isolateChanged(oldValue) { | 
| 468     _getCpuProfile(); | 468     _getCpuProfile().catchError(app.handleException); | 
| 469   } | 469   } | 
| 470 | 470 | 
| 471   void tagSelectorChanged(oldValue) { | 471   void tagSelectorChanged(oldValue) { | 
| 472     _getCpuProfile(); | 472     _getCpuProfile().catchError(app.handleException); | 
| 473   } | 473   } | 
| 474 | 474 | 
| 475   void modeSelectorChanged(oldValue) { | 475   void modeSelectorChanged(oldValue) { | 
| 476     _updateView(); | 476     _updateView(); | 
| 477   } | 477   } | 
| 478 | 478 | 
| 479   void directionSelectorChanged(oldValue) { | 479   void directionSelectorChanged(oldValue) { | 
| 480     _updateView(); | 480     _updateView(); | 
| 481   } | 481   } | 
| 482 | 482 | 
| 483   void clear(var done) { | 483   Future clearCpuProfile() { | 
| 484     _clearCpuProfile().whenComplete(done); |  | 
| 485   } |  | 
| 486 |  | 
| 487   Future _clearCpuProfile() { |  | 
| 488     profile.clear(); | 484     profile.clear(); | 
| 489     if (isolate == null) { | 485     if (isolate == null) { | 
| 490       return new Future.value(null); | 486       return new Future.value(null); | 
| 491     } | 487     } | 
| 492     return isolate.invokeRpc('clearCpuProfile', { }) | 488     return isolate.invokeRpc('clearCpuProfile', { }) | 
| 493         .then((ServiceMap response) { | 489         .then((ServiceMap response) { | 
| 494           _updateView(); | 490           _updateView(); | 
| 495         }); | 491         }); | 
| 496   } | 492   } | 
| 497 | 493 | 
| 498   void refresh(var done) { | 494   Future refresh() { | 
| 499     _getCpuProfile().whenComplete(done); | 495     return _getCpuProfile(); | 
| 500   } | 496   } | 
| 501 | 497 | 
| 502   _onFetchStarted() { | 498   _onFetchStarted() { | 
| 503     _sw.reset(); | 499     _sw.reset(); | 
| 504     _sw.start(); | 500     _sw.start(); | 
| 505     state = 'Requested'; | 501     state = 'Requested'; | 
| 506   } | 502   } | 
| 507 | 503 | 
| 508   _onFetchFinished() { | 504   _onFetchFinished() { | 
| 509     _sw.stop(); | 505     _sw.stop(); | 
| 510     fetchTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 506     fetchTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 
| 511   } | 507   } | 
| 512 | 508 | 
| 513   Future _onLoadStarted() { | 509   Future _onLoadStarted() { | 
| 514     _sw.reset(); | 510     _sw.reset(); | 
| 515     _sw.start(); | 511     _sw.start(); | 
| 516     state = 'Loading'; | 512     state = 'Loading'; | 
| 517     return window.animationFrame; | 513     return window.animationFrame; | 
| 518   } | 514   } | 
| 519 | 515 | 
| 520   _onLoadFinished() { | 516   _onLoadFinished() { | 
| 521     _sw.stop(); | 517     _sw.stop(); | 
| 522     loadTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 518     loadTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 
| 523     state = 'Loaded'; | 519     state = 'Loaded'; | 
| 524   } | 520   } | 
| 525 | 521 | 
| 526   Future _getCpuProfile() { | 522   Future _getCpuProfile() async { | 
| 527     profile.clear(); | 523     profile.clear(); | 
| 528     if (functionTree != null) { | 524     if (functionTree != null) { | 
| 529       functionTree.clear(); | 525       functionTree.clear(); | 
| 530       functionTree = null; | 526       functionTree = null; | 
| 531     } | 527     } | 
| 532     if (codeTree != null) { | 528     if (codeTree != null) { | 
| 533       codeTree.clear(); | 529       codeTree.clear(); | 
| 534       codeTree = null; | 530       codeTree = null; | 
| 535     } | 531     } | 
| 536     if (isolate == null) { | 532     if (isolate == null) { | 
| 537       return new Future.value(null); | 533       return new Future.value(null); | 
| 538     } | 534     } | 
| 539     _onFetchStarted(); | 535     _onFetchStarted(); | 
| 540     return isolate.invokeRpc('getCpuProfile', { 'tags': tagSelector }) | 536     try { | 
| 541         .then((response) async { | 537       var params = { 'tags': tagSelector }; | 
|  | 538       var response = await isolate.invokeRpc('getCpuProfile', params); | 
| 542       _onFetchFinished(); | 539       _onFetchFinished(); | 
| 543       await _onLoadStarted(); | 540       await _onLoadStarted(); | 
| 544       try { | 541       profile.load(isolate, response); | 
| 545         profile.load(isolate, response); | 542       _onLoadFinished(); | 
| 546         _onLoadFinished(); | 543       _updateView(); | 
| 547         _updateView(); | 544     } catch (e, st) { | 
| 548       } catch (e, st) { | 545       bool handled = false; | 
|  | 546       if (e is ServerRpcException) { | 
|  | 547         ServerRpcException se = e; | 
|  | 548         if (se.code == ServerRpcException.kProfilingDisabled) { | 
|  | 549           state = 'Disabled'; | 
|  | 550           handled = true; | 
|  | 551         } | 
|  | 552       } | 
|  | 553       if (!handled) { | 
| 549         state = 'Exception'; | 554         state = 'Exception'; | 
| 550         exception = e; | 555         exception = e; | 
| 551         stackTrace = st; | 556         stackTrace = st; | 
|  | 557         rethrow; | 
| 552       } | 558       } | 
| 553     }).catchError((e, st) { | 559     } | 
| 554       state = 'Exception'; |  | 
| 555       exception = e; |  | 
| 556       stackTrace = st; |  | 
| 557     }); |  | 
| 558   } | 560   } | 
| 559 | 561 | 
| 560   void _updateView() { | 562   void _updateView() { | 
| 561     sampleCount = profile.sampleCount.toString(); | 563     sampleCount = profile.sampleCount.toString(); | 
| 562     refreshTime = new DateTime.now().toString(); | 564     refreshTime = new DateTime.now().toString(); | 
| 563     stackDepth = profile.stackDepth.toString(); | 565     stackDepth = profile.stackDepth.toString(); | 
| 564     sampleRate = profile.sampleRate.toStringAsFixed(0); | 566     sampleRate = profile.sampleRate.toStringAsFixed(0); | 
| 565     timeSpan = formatTime(profile.timeSpan); | 567     timeSpan = formatTime(profile.timeSpan); | 
| 566     bool exclusive = directionSelector == 'Up'; | 568     bool exclusive = directionSelector == 'Up'; | 
| 567     if (functionTree != null) { | 569     if (functionTree != null) { | 
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 787   _updateSize() { | 789   _updateSize() { | 
| 788     HtmlElement e = $['main']; | 790     HtmlElement e = $['main']; | 
| 789     final totalHeight = window.innerHeight; | 791     final totalHeight = window.innerHeight; | 
| 790     final top = e.offset.top; | 792     final top = e.offset.top; | 
| 791     final bottomMargin = 32; | 793     final bottomMargin = 32; | 
| 792     final mainHeight = totalHeight - top - bottomMargin; | 794     final mainHeight = totalHeight - top - bottomMargin; | 
| 793     e.style.setProperty('height', '${mainHeight}px'); | 795     e.style.setProperty('height', '${mainHeight}px'); | 
| 794   } | 796   } | 
| 795 | 797 | 
| 796   isolateChanged() { | 798   isolateChanged() { | 
| 797     _getCpuProfile().whenComplete(checkParameters); | 799     _getCpuProfile() | 
|  | 800       .catchError(app.handleException) | 
|  | 801       .whenComplete(checkParameters); | 
| 798   } | 802   } | 
| 799 | 803 | 
| 800   checkParameters() { | 804   checkParameters() { | 
| 801     var functionId = app.locationManager.uri.queryParameters['functionId']; | 805     var functionId = app.locationManager.uri.queryParameters['functionId']; | 
| 802     if (functionId == null) { | 806     if (functionId == null) { | 
| 803       _focusOnFunction(null); | 807       _focusOnFunction(null); | 
| 804       return; | 808       return; | 
| 805     } | 809     } | 
| 806     if (isolate == null) { | 810     if (isolate == null) { | 
| 807       return; | 811       return; | 
| 808     } | 812     } | 
| 809     isolate.getObject(functionId).then((func) => _focusOnFunction(func)); | 813     isolate.getObject(functionId).then((func) => _focusOnFunction(func)); | 
| 810   } | 814   } | 
| 811 | 815 | 
| 812   void directionSelectorChanged(oldValue) { | 816   void directionSelectorChanged(oldValue) { | 
| 813     _updateFunctionTreeView(); | 817     _updateFunctionTreeView(); | 
| 814   } | 818   } | 
| 815 | 819 | 
| 816   void refresh(var done) { | 820   Future refresh() { | 
| 817     _getCpuProfile().whenComplete(done); | 821     return _getCpuProfile(); | 
| 818   } |  | 
| 819 |  | 
| 820   void clear(var done) { |  | 
| 821     _clearCpuProfile().whenComplete(done); |  | 
| 822   } | 822   } | 
| 823 | 823 | 
| 824   _onFetchStarted() { | 824   _onFetchStarted() { | 
| 825     _sw.reset(); | 825     _sw.reset(); | 
| 826     _sw.start(); | 826     _sw.start(); | 
| 827     state = 'Requested'; | 827     state = 'Requested'; | 
| 828   } | 828   } | 
| 829 | 829 | 
| 830   _onFetchFinished() { | 830   _onFetchFinished() { | 
| 831     _sw.stop(); | 831     _sw.stop(); | 
| 832     fetchTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 832     fetchTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 
| 833   } | 833   } | 
| 834 | 834 | 
| 835   _onLoadStarted() { | 835   _onLoadStarted() { | 
| 836     _sw.reset(); | 836     _sw.reset(); | 
| 837     _sw.start(); | 837     _sw.start(); | 
| 838     state = 'Loading'; | 838     state = 'Loading'; | 
| 839   } | 839   } | 
| 840 | 840 | 
| 841   _onLoadFinished() { | 841   _onLoadFinished() { | 
| 842     _sw.stop(); | 842     _sw.stop(); | 
| 843     loadTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 843     loadTime = formatTimeMilliseconds(_sw.elapsedMilliseconds); | 
| 844     state = 'Loaded'; | 844     state = 'Loaded'; | 
| 845   } | 845   } | 
| 846 | 846 | 
| 847   Future _clearCpuProfile() { | 847   Future clearCpuProfile() { | 
| 848     profile.clear(); | 848     profile.clear(); | 
| 849     _clearView(); | 849     _clearView(); | 
| 850     if (isolate == null) { | 850     if (isolate == null) { | 
| 851       return new Future.value(null); | 851       return new Future.value(null); | 
| 852     } | 852     } | 
| 853     return isolate.invokeRpc('clearCpuProfile', { }) | 853     return isolate.invokeRpc('clearCpuProfile', { }) | 
| 854     .then((ServiceMap response) { | 854     .then((ServiceMap response) { | 
| 855       _updateView(); | 855       _updateView(); | 
| 856     }); | 856     }); | 
| 857   } | 857   } | 
| 858 | 858 | 
| 859   Future _getCpuProfile() { | 859   Future _getCpuProfile() async { | 
| 860     profile.clear(); | 860     profile.clear(); | 
| 861     _clearView(); | 861     _clearView(); | 
| 862     if (isolate == null) { | 862     if (isolate == null) { | 
| 863       return new Future.value(null); | 863       return new Future.value(null); | 
| 864     } | 864     } | 
| 865     _onFetchStarted(); | 865     _onFetchStarted(); | 
| 866     return isolate.invokeRpc('getCpuProfile', { 'tags': 'None' }) | 866     try { | 
| 867     .then((response) { | 867       var params = { 'tags': 'None' }; | 
|  | 868       var response = await isolate.invokeRpc('getCpuProfile', params); | 
| 868       _onFetchFinished(); | 869       _onFetchFinished(); | 
| 869       _onLoadStarted(); | 870       _onLoadStarted(); | 
| 870       try { | 871       profile.load(isolate, response); | 
| 871         profile.load(isolate, response); | 872       profile.buildFunctionCallerAndCallees(); | 
| 872         profile.buildFunctionCallerAndCallees(); | 873       _onLoadFinished(); | 
| 873         _onLoadFinished(); | 874       _updateView(); | 
| 874         _updateView(); | 875     } catch (e, st) { | 
| 875       } catch (e, st) { | 876       bool handled = false; | 
|  | 877       if (e is ServerRpcException) { | 
|  | 878         ServerRpcException se = e; | 
|  | 879         if (se.code == ServerRpcException.kProfilingDisabled) { | 
|  | 880           state = 'Disabled'; | 
|  | 881           handled = true; | 
|  | 882         } | 
|  | 883       } | 
|  | 884       if (!handled) { | 
| 876         state = 'Exception'; | 885         state = 'Exception'; | 
| 877         exception = e; | 886         exception = e; | 
| 878         stackTrace = st; | 887         stackTrace = st; | 
|  | 888         rethrow; | 
| 879       } | 889       } | 
| 880     }).catchError((e, st) { | 890     } | 
| 881       state = 'Exception'; |  | 
| 882       exception = e; |  | 
| 883       stackTrace = st; |  | 
| 884     }); |  | 
| 885   } | 891   } | 
| 886 | 892 | 
| 887   _clearView() { | 893   _clearView() { | 
| 888     profileTable.clearRows(); | 894     profileTable.clearRows(); | 
| 889     _renderTable(); | 895     _renderTable(); | 
| 890   } | 896   } | 
| 891 | 897 | 
| 892   _updateView() { | 898   _updateView() { | 
| 893     sampleCount = profile.sampleCount.toString(); | 899     sampleCount = profile.sampleCount.toString(); | 
| 894     refreshTime = new DateTime.now().toString(); | 900     refreshTime = new DateTime.now().toString(); | 
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1117     } | 1123     } | 
| 1118     var filter = (FunctionCallTreeNode node) { | 1124     var filter = (FunctionCallTreeNode node) { | 
| 1119       return node.profileFunction.function == focusedFunction; | 1125       return node.profileFunction.function == focusedFunction; | 
| 1120     }; | 1126     }; | 
| 1121     tree = tree.filtered(filter); | 1127     tree = tree.filtered(filter); | 
| 1122     var rootRow = | 1128     var rootRow = | 
| 1123         new FunctionProfileTreeRow(functionTree, null, profile, tree.root); | 1129         new FunctionProfileTreeRow(functionTree, null, profile, tree.root); | 
| 1124     functionTree.initialize(rootRow); | 1130     functionTree.initialize(rootRow); | 
| 1125   } | 1131   } | 
| 1126 } | 1132 } | 
| OLD | NEW | 
|---|