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