Index: runtime/vm/service/vmservice.dart |
diff --git a/runtime/vm/service/vmservice.dart b/runtime/vm/service/vmservice.dart |
index d4eca93ddb6b64c4580bf25cc0dc520b12e50445..934bd6fcd354fffaba11c2819bc8080782fc1fb6 100644 |
--- a/runtime/vm/service/vmservice.dart |
+++ b/runtime/vm/service/vmservice.dart |
@@ -18,6 +18,8 @@ part 'message_router.dart'; |
final RawReceivePort isolateLifecyclePort = new RawReceivePort(); |
final RawReceivePort scriptLoadPort = new RawReceivePort(); |
+typedef ShutdownCallback(); |
+ |
class VMService extends MessageRouter { |
static VMService _instance; |
/// Collection of currently connected clients. |
@@ -32,6 +34,8 @@ class VMService extends MessageRouter { |
/// A port used to receive events from the VM. |
final RawReceivePort eventPort; |
+ ShutdownCallback onShutdown; |
+ |
void _addClient(Client client) { |
clients.add(client); |
} |
@@ -94,12 +98,28 @@ class VMService extends MessageRouter { |
} |
} |
+ void _exit() { |
+ if (onShutdown != null) { |
+ onShutdown(); |
+ } |
+ isolateLifecyclePort.close(); |
+ scriptLoadPort.close(); |
+ var clientList = clients.toList(); |
+ for (var client in clientList) { |
+ client.close(); |
+ } |
+ _onExit(); |
+ } |
+ |
void messageHandler(message) { |
assert(message is List); |
- if (message is List && message.length == 4) { |
+ if (message is List && (message.length == 4)) { |
_controlMessageHandler(message[0], message[1], message[2], message[3]); |
- } else if (message is List && message.length == 2) { |
+ } 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'); |
} |
@@ -164,3 +184,5 @@ void _setEventMask(int mask) |
native "VMService_SetEventMask"; |
void _onStart() native "VMService_OnStart"; |
+ |
+void _onExit() native "VMService_OnExit"; |