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

Unified Diff: runtime/vm/service/vmservice.dart

Issue 1077823003: Some cleanups in the code that posts results to service clients. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 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
« no previous file with comments | « runtime/vm/service/constants.dart ('k') | runtime/vm/service_isolate.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/service/vmservice.dart
diff --git a/runtime/vm/service/vmservice.dart b/runtime/vm/service/vmservice.dart
index 934bd6fcd354fffaba11c2819bc8080782fc1fb6..95254a3d234fb4e2e943ce7488a622af03ded85e 100644
--- a/runtime/vm/service/vmservice.dart
+++ b/runtime/vm/service/vmservice.dart
@@ -7,6 +7,7 @@ library vmservice;
import 'dart:async';
import 'dart:convert';
import 'dart:isolate';
+import 'dart:typed_data';
part 'client.dart';
part 'constants.dart';
@@ -22,12 +23,10 @@ typedef ShutdownCallback();
class VMService extends MessageRouter {
static VMService _instance;
+
/// Collection of currently connected clients.
final Set<Client> clients = new Set<Client>();
- // A map encoding which clients are interested in which kinds of events.
- final Map<int, Set<Client>> eventMap = new Map<int, Set<Client>>();
-
/// Collection of currently running isolates.
RunningIsolates runningIsolates = new RunningIsolates();
@@ -44,85 +43,71 @@ class VMService extends MessageRouter {
clients.remove(client);
}
- int eventTypeCode(String eventType) {
- switch(eventType) {
- case 'debug':
- return Constants.EVENT_FAMILY_DEBUG;
- case 'gc':
- return Constants.EVENT_FAMILY_GC;
- default:
- return -1;
- }
- }
-
- void _updateEventMask() {
- int mask = 0;
- for (var key in eventMap.keys) {
- var subscribers = eventMap[key];
- if (subscribers.isNotEmpty) {
- mask |= (1 << key);
+ void _eventMessageHandler(dynamic eventMessage) {
+ for (var client in clients) {
+ if (client.sendEvents) {
+ client.post(null, eventMessage);
}
}
- _setEventMask(mask);
- }
-
- void subscribe(String eventType, Client client) {
- int eventCode = eventTypeCode(eventType);
- assert(eventCode >= 0);
- var subscribers = eventMap.putIfAbsent(eventCode, () => new Set<Client>());
- subscribers.add(client);
- _updateEventMask();
}
void _controlMessageHandler(int code,
- int port_id,
+ int portId,
SendPort sp,
String name) {
switch (code) {
case Constants.ISOLATE_STARTUP_MESSAGE_ID:
- runningIsolates.isolateStartup(port_id, sp, name);
+ runningIsolates.isolateStartup(portId, sp, name);
break;
case Constants.ISOLATE_SHUTDOWN_MESSAGE_ID:
- runningIsolates.isolateShutdown(port_id, sp);
+ runningIsolates.isolateShutdown(portId, sp);
break;
}
}
- void _eventMessageHandler(int eventType, dynamic eventMessage) {
- var subscribers = eventMap[eventType];
- if (subscribers == null) {
- return;
- }
- for (var subscriber in subscribers) {
- subscriber.post(null, eventMessage);
- }
- }
-
void _exit() {
if (onShutdown != null) {
onShutdown();
}
isolateLifecyclePort.close();
scriptLoadPort.close();
- var clientList = clients.toList();
- for (var client in clientList) {
+ for (var client in clients) {
client.close();
}
_onExit();
}
void messageHandler(message) {
- assert(message is List);
- if (message is List && (message.length == 4)) {
- _controlMessageHandler(message[0], message[1], message[2], message[3]);
- } else if (message is List && (message.length == 2)) {
- _eventMessageHandler(message[0], message[1]);
- } else if (message is List && (message.length == 1)) {
- assert(message[0] == Constants.SERVICE_EXIT_MESSAGE_ID);
- _exit();
- } else {
- Logger.root.severe('Unexpected message: $message');
+ if (message is String) {
+ // This is an event intended for all clients.
+ _eventMessageHandler(message);
+ return;
+ }
+ if (message is Uint8List) {
+ // This is "raw" data intended for a specific client.
+ //
+ // TODO(turnidge): Do not broadcast this data to all clients.
+ _eventMessageHandler(message);
+ return;
}
+ if (message is List) {
+ // This is an internal vm service event.
+ if (message.length == 1) {
+ // This is a control message directing the vm service to exit.
+ assert(message[0] == Constants.SERVICE_EXIT_MESSAGE_ID);
+ _exit();
+ return;
+ }
+ if (message.length == 4) {
+ // This is a message informing us of the birth or death of an
+ // isolate.
+ _controlMessageHandler(message[0], message[1], message[2], message[3]);
+ return;
+ }
+ }
+
+ Logger.root.severe(
+ 'Internal vm-service error: ignoring illegal message: $message');
}
void _notSupported(_) {
@@ -180,9 +165,6 @@ void _registerIsolate(int port_id, SendPort sp, String name) {
service.runningIsolates.isolateStartup(port_id, sp, name);
}
-void _setEventMask(int mask)
- native "VMService_SetEventMask";
-
void _onStart() native "VMService_OnStart";
void _onExit() native "VMService_OnExit";
« no previous file with comments | « runtime/vm/service/constants.dart ('k') | runtime/vm/service_isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698