Index: runtime/observatory/lib/src/elements/debugger.dart |
diff --git a/runtime/observatory/lib/src/elements/debugger.dart b/runtime/observatory/lib/src/elements/debugger.dart |
index 28f75139b86b89015130e0aab4edc643a8531012..a260f765c0b39835ddbb41e4d86aa421f6502886 100644 |
--- a/runtime/observatory/lib/src/elements/debugger.dart |
+++ b/runtime/observatory/lib/src/elements/debugger.dart |
@@ -6,6 +6,7 @@ library debugger_page_element; |
import 'dart:async'; |
import 'dart:html'; |
+import 'dart:math'; |
import 'observatory_element.dart'; |
import 'package:observatory/app.dart'; |
import 'package:observatory/cli.dart'; |
@@ -963,7 +964,7 @@ class IsolateCommand extends DebuggerCommand { |
String helpShort = 'Switch the current isolate'; |
String helpLong = |
- 'Switch the current isolate.\n' |
+ 'Switch, list, or rename isolates.\n' |
'\n' |
'Syntax: isolate <number>\n' |
' isolate <name>\n'; |
@@ -998,15 +999,12 @@ class IsolateListCommand extends DebuggerCommand { |
} |
await Future.wait(pending); |
- const maxIdLen = 9; |
+ const maxIdLen = 10; |
const maxRunStateLen = 7; |
- var maxNameLen = 0; |
+ var maxNameLen = 'NAME'.length; |
for (var isolate in debugger.vm.isolates) { |
- if (isolate.name.length > maxNameLen) { |
- maxNameLen = isolate.name.length; |
- } |
+ maxNameLen = max(maxNameLen, isolate.name.length); |
} |
- |
debugger.console.print("${'ID'.padLeft(maxIdLen, ' ')} " |
"${'ORIGIN'.padLeft(maxIdLen, ' ')} " |
"${'NAME'.padRight(maxNameLen, ' ')} " |
@@ -1125,6 +1123,72 @@ class RefreshCommand extends DebuggerCommand { |
'Syntax: refresh <subcommand>\n'; |
} |
+class VmListCommand extends DebuggerCommand { |
+ VmListCommand(Debugger debugger) : super(debugger, 'list', []); |
+ |
+ Future run(List<String> args) async { |
+ if (args.length > 0) { |
+ debugger.console.print('vm list expects no arguments'); |
+ return; |
+ } |
+ if (debugger.vm == null) { |
+ debugger.console.print("No connected VMs"); |
+ return; |
+ } |
+ // TODO(turnidge): Right now there is only one vm listed. |
+ var vmList = [debugger.vm]; |
+ |
+ var maxAddrLen = 'ADDRESS'.length; |
+ var maxNameLen = 'NAME'.length; |
+ |
+ for (var vm in vmList) { |
+ maxAddrLen = max(maxAddrLen, vm.target.networkAddress.length); |
+ maxNameLen = max(maxNameLen, vm.name.length); |
+ } |
+ |
+ debugger.console.print("${'ADDRESS'.padRight(maxAddrLen, ' ')} " |
+ "${'NAME'.padRight(maxNameLen, ' ')} " |
+ "CURRENT"); |
+ for (var vm in vmList) { |
+ String current = (vm == debugger.vm ? '*' : ''); |
+ debugger.console.print( |
+ "${vm.target.networkAddress.padRight(maxAddrLen, ' ')} " |
+ "${vm.name.padRight(maxNameLen, ' ')} " |
+ "${current}"); |
+ } |
+ } |
+ |
+ String helpShort = 'List all connected Dart virtual machines'; |
+ |
+ String helpLong = |
+ 'List all connected Dart virtual machines..\n' |
+ '\n' |
+ 'Syntax: vm list\n'; |
+} |
+ |
+class VmNameCommand extends DebuggerCommand { |
+ VmNameCommand(Debugger debugger) : super(debugger, 'name', []); |
+ |
+ Future run(List<String> args) async { |
+ if (args.length != 1) { |
+ debugger.console.print('vm name expects one argument'); |
+ return; |
+ } |
+ if (debugger.vm == null) { |
+ debugger.console.print('There is no current vm'); |
+ return; |
+ } |
+ await debugger.vm.setName(args[0]); |
+ } |
+ |
+ String helpShort = 'Rename the current Dart virtual machine'; |
+ |
+ String helpLong = |
+ 'Rename the current Dart virtual machine.\n' |
+ '\n' |
+ 'Syntax: vm name <name>\n'; |
+} |
+ |
class VmRestartCommand extends DebuggerCommand { |
VmRestartCommand(Debugger debugger) : super(debugger, 'restart', []); |
@@ -1155,6 +1219,8 @@ class VmRestartCommand extends DebuggerCommand { |
class VmCommand extends DebuggerCommand { |
VmCommand(Debugger debugger) : super(debugger, 'vm', [ |
+ new VmListCommand(debugger), |
+ new VmNameCommand(debugger), |
new VmRestartCommand(debugger), |
]); |
@@ -1517,6 +1583,11 @@ class ObservatoryDebugger extends Debugger { |
void onEvent(ServiceEvent event) { |
switch(event.kind) { |
+ case ServiceEvent.kVMUpdate: |
+ var vm = event.owner; |
+ console.print("VM ${vm.target.networkAddress} renamed to '${vm.name}'"); |
+ break; |
+ |
case ServiceEvent.kIsolateStart: |
{ |
var iso = event.owner; |
@@ -1809,6 +1880,7 @@ class DebuggerPageElement extends ObservatoryElement { |
} |
StreamSubscription _resizeSubscription; |
+ Future<StreamSubscription> _vmSubscriptionFuture; |
Future<StreamSubscription> _isolateSubscriptionFuture; |
Future<StreamSubscription> _debugSubscriptionFuture; |
Future<StreamSubscription> _stdoutSubscriptionFuture; |
@@ -1830,6 +1902,8 @@ class DebuggerPageElement extends ObservatoryElement { |
debugger.init(); |
_resizeSubscription = window.onResize.listen(_onResize); |
+ _vmSubscriptionFuture = |
+ app.vm.listenEventStream(VM.kVMStream, debugger.onEvent); |
_isolateSubscriptionFuture = |
app.vm.listenEventStream(VM.kIsolateStream, debugger.onEvent); |
_debugSubscriptionFuture = |
@@ -1892,6 +1966,8 @@ class DebuggerPageElement extends ObservatoryElement { |
debugger.isolate = null; |
_resizeSubscription.cancel(); |
_resizeSubscription = null; |
+ cancelFutureSubscription(_vmSubscriptionFuture); |
+ _vmSubscriptionFuture = null; |
cancelFutureSubscription(_isolateSubscriptionFuture); |
_isolateSubscriptionFuture = null; |
cancelFutureSubscription(_debugSubscriptionFuture); |