Index: runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.dart |
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f0e261daa6b8f5fcc7e60e6517a54578e69d72ca |
--- /dev/null |
+++ b/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.dart |
@@ -0,0 +1,149 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library isolate_profile_element; |
+ |
+import 'dart:convert'; |
+import 'dart:html'; |
+import 'package:dprof/model.dart' as dprof; |
+import 'package:polymer/polymer.dart'; |
+import 'observatory_element.dart'; |
+ |
+/// Displays an IsolateProfile |
+@CustomTag('isolate-profile') |
+class IsolateProfileElement extends ObservatoryElement { |
+ IsolateProfileElement.created() : super.created(); |
+ @observable int methodCountSelected = 0; |
+ final List methodCounts = [10, 20, 50]; |
+ @observable List topInclusiveCodes = toObservable([]); |
+ @observable List topExclusiveCodes = toObservable([]); |
+ @observable bool disassemble = false; |
+ void _startRequest() { |
+ // TODO(johnmccutchan): Indicate visually. |
+ print('Request sent.'); |
+ } |
+ |
+ void _endRequest() { |
+ // TODO(johnmccutchan): Indicate visually. |
+ print('Request finished.'); |
+ } |
+ |
+ methodCountSelectedChanged(oldValue) { |
+ print('Refresh top'); |
+ var isolateId = app.locationManager.currentIsolateId(); |
+ var isolate = app.isolateManager.getIsolate(isolateId); |
+ if (isolate == null) { |
+ print('No isolate found.'); |
+ } |
+ _refreshTopMethods(isolate); |
+ } |
+ |
+ void toggleDisassemble(Event e, var detail, CheckboxInputElement target) { |
+ disassemble = target.checked; |
+ print(disassemble); |
+ } |
+ |
+ void refreshData(Event e, var detail, Node target) { |
+ var isolateId = app.locationManager.currentIsolateId(); |
+ var isolate = app.isolateManager.getIsolate(isolateId); |
+ if (isolate == null) { |
+ print('No isolate found.'); |
+ } |
+ var request = '/$isolateId/profile'; |
+ _startRequest(); |
+ app.requestManager.request(request).then((response) { |
+ var profile; |
+ try { |
+ profile = JSON.decode(response); |
+ } catch (e) { print(e); } |
+ if ((profile is Map) && (profile['type'] == 'Profile')) { |
+ var codes = profile['codes']; |
+ var samples = profile['samples']; |
+ _loadProfileData(isolate, samples, codes); |
+ } |
+ _endRequest(); |
+ }).catchError((e) { |
+ _endRequest(); |
+ }); |
+ } |
+ |
+ void _loadProfileData(Isolate isolate, int totalSamples, List codes) { |
+ isolate.profiler = new dprof.Isolate(0, 0); |
+ var loader = new dprof.Loader(isolate.profiler); |
+ loader.load(totalSamples, codes); |
+ _refreshTopMethods(isolate); |
+ } |
+ |
+ void _refreshTopMethods(Isolate isolate) { |
+ topExclusiveCodes.clear(); |
+ topInclusiveCodes.clear(); |
+ if ((isolate == null) || (isolate.profiler == null)) { |
+ return; |
+ } |
+ var count = methodCounts[methodCountSelected]; |
+ var topExclusive = isolate.profiler.topExclusive(count); |
+ topExclusiveCodes.addAll(topExclusive); |
+ var topInclusive = isolate.profiler.topInclusive(count); |
+ topInclusiveCodes.addAll(topInclusive); |
+ |
+ } |
+ |
+ String codeTicks(dprof.Code code, bool inclusive) { |
+ if (code == null) { |
+ return ''; |
+ } |
+ return inclusive ? '${code.inclusiveTicks}' : '${code.exclusiveTicks}'; |
+ } |
+ |
+ String codePercent(dprof.Code code, bool inclusive) { |
+ if (code == null) { |
+ return ''; |
+ } |
+ var isolateId = app.locationManager.currentIsolateId(); |
+ var isolate = app.isolateManager.getIsolate(isolateId); |
+ if (isolate == null) { |
+ return ''; |
+ } |
+ var ticks = inclusive ? code.inclusiveTicks : code.exclusiveTicks; |
+ var total = ticks / isolate.profiler.totalSamples; |
+ return (total * 100.0).toStringAsFixed(2); |
+ } |
+ |
+ String codeName(dprof.Code code) { |
+ if ((code == null) || (code.method == null)) { |
+ return ''; |
+ } |
+ return code.method.name; |
+ } |
+ |
+ String instructionTicks(dprof.Instruction instruction) { |
+ if (instruction == null) { |
+ return ''; |
+ } |
+ if (instruction.ticks == 0) { |
+ return ''; |
+ } |
+ return '${instruction.ticks}'; |
+ } |
+ |
+ String instructionPercent(dprof.Instruction instruction, |
+ dprof.Code code) { |
+ if ((instruction == null) || (code == null)) { |
+ return ''; |
+ } |
+ if (instruction.ticks == 0) { |
+ return ''; |
+ } |
+ var ticks = instruction.ticks; |
+ var total = ticks / code.inclusiveTicks; |
+ return (total * 100.0).toStringAsFixed(2); |
+ } |
+ |
+ String instructionDisplay(dprof.Instruction instruction) { |
+ if (instruction == null) { |
+ return ''; |
+ } |
+ return instruction.human; |
+ } |
+} |