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

Unified Diff: runtime/bin/vmservice/client/lib/src/service/object.dart

Issue 340443006: Add support for asynchronous event notification to the observatory. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 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
Index: runtime/bin/vmservice/client/lib/src/service/object.dart
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index d63afa36846e2714e1f809e749e331ae2d9a5552..bc9f9f1596a8a48fbb96eec9db43ed52d7259796 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -72,7 +72,7 @@ abstract class ServiceObject extends Observable {
obj = new DartError._empty(owner);
break;
case 'Isolate':
- obj = new Isolate._empty(owner);
+ obj = new Isolate._empty(owner.vm);
break;
case 'Library':
obj = new Library._empty(owner);
@@ -80,6 +80,9 @@ abstract class ServiceObject extends Observable {
case 'ServiceError':
obj = new ServiceError._empty(owner);
break;
+ case 'ServiceEvent':
+ obj = new ServiceEvent._empty(owner);
+ break;
case 'ServiceException':
obj = new ServiceException._empty(owner);
break;
@@ -204,6 +207,29 @@ abstract class VM extends ServiceObjectOwner {
new StreamController.broadcast();
final StreamController<ServiceError> errors =
new StreamController.broadcast();
+ final StreamController<ServiceEvent> events =
+ new StreamController.broadcast();
+
+ void postEventMessage(String eventMessage) {
Cutch 2014/06/27 16:03:49 Why isn't the event just upgraded like other servi
turnidge 2014/06/27 18:15:06 I don't understand. Let's chat in person.
+ var map;
+ try {
+ map = _parseJSON(eventMessage);
+ } catch (e, st) {
+ Logger.root.severe('Ignoring malformed event message: ${eventMessage}');
+ return;
+ }
+ if (map['type'] != 'ServiceEvent') {
+ Logger.root.severe(
+ "Expected 'ServiceEvent' but found '${map['type']}'");
+ return;
+ }
+ // Extract the owning isolate from the event itself.
+ String owningIsolateId = map['isolate']['id'];
+ _getIsolate(owningIsolateId).then((owningIsolate) {
+ var event = new ServiceObject._fromMap(owningIsolate, map);
+ events.add(event);
+ });
+ }
static final RegExp _currentIsolateMatcher = new RegExp(r'isolates/\d+');
static final RegExp _currentObjectMatcher = new RegExp(r'isolates/\d+/');
@@ -513,7 +539,7 @@ class Isolate extends ServiceObjectOwner {
String get link => '/${_id}';
- @observable ServiceMap pauseEvent = null;
+ @observable ServiceEvent pauseEvent = null;
bool get _isPaused => pauseEvent != null;
@observable bool running = false;
@@ -769,6 +795,17 @@ class Isolate extends ServiceObjectOwner {
idle = (!_isPaused && map['topFrame'] == null);
error = map['error'];
+ // Synthesize a resume event if this isolate is not paused.
+ if (pauseEvent == null) {
+ var event = new ServiceObject._fromMap(this, toObservable({
+ 'type': 'ServiceEvent',
+ 'id': '',
+ 'eventType': 'IsolateResumed',
+ 'isolate': id,
+ }));
+ vm.events.add(event);
Cutch 2014/06/27 16:03:49 Why do we synthesize a resume event every time we
turnidge 2014/06/27 18:15:06 I was using a fake resume event to clear out any p
+ }
+
libraries.clear();
for (var lib in map['libraries']) {
libraries.add(lib);
@@ -950,6 +987,29 @@ class ServiceException extends ServiceObject {
}
}
+/// A [ServiceEvent] is an asynchronous event notification from the vm.
+class ServiceEvent extends ServiceObject {
+ ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+ @observable String eventType;
+ @observable ServiceMap breakpoint;
+ @observable ServiceMap exception;
+
+ void _update(ObservableMap map, bool mapIsRef) {
+ _loaded = true;
+ _upgradeCollection(map, owner);
+ eventType = map['eventType'];
+ name = 'ServiceEvent $eventType';
+ vmName = name;
+ if (map['breakpoint'] != null) {
+ breakpoint = map['breakpoint'];
+ }
+ if (map['exception'] != null) {
+ exception = map['exception'];
+ }
+ }
+}
+
class Library extends ServiceObject {
@observable String url;
@reflectable final imports = new ObservableList<Library>();
@@ -1382,7 +1442,7 @@ class CodeInstruction extends Observable {
int address = _getJumpAddress();
if (address == 0) {
// Could not determine jump address.
- print('Could not determine jump address for $human');
+ Logger.root.severe('Could not determine jump address for $human');
return;
}
for (var i = 0; i < instructions.length; i++) {
@@ -1392,7 +1452,8 @@ class CodeInstruction extends Observable {
return;
}
}
- print('Could not find instruction at ${address.toRadixString(16)}');
+ Logger.root.severe(
+ 'Could not find instruction at ${address.toRadixString(16)}');
}
}

Powered by Google App Engine
This is Rietveld 408576698