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"; |