| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| part of observatory; |
| |
| /// Collection of isolates which are running in the VM. Updated |
| class IsolateManager extends Observable { |
| ObservatoryApplication _application; |
| ObservatoryApplication get application => _application; |
| |
| @observable final Map<String, Isolate> isolates = |
| toObservable(new Map<String, Isolate>()); |
| |
| static bool _foundIsolateInMembers(String id, List<Map> members) { |
| return members.any((E) => E['id'] == id); |
| } |
| |
| void _responseInterceptor() { |
| _application.requestManager.responses.forEach((response) { |
| if (response['type'] == 'IsolateList') { |
| _updateIsolates(response['members']); |
| } |
| }); |
| } |
| |
| Isolate getIsolate(String id) { |
| Isolate isolate = isolates[id]; |
| if (isolate == null) { |
| isolate = new Isolate.fromId(id); |
| isolates[id] = isolate; |
| return isolate; |
| } |
| return isolate; |
| } |
| |
| void _updateIsolates(List<Map> members) { |
| // Find dead isolates. |
| var deadIsolates = []; |
| isolates.forEach((k, v) { |
| if (!_foundIsolateInMembers(k, members)) { |
| deadIsolates.add(k); |
| } |
| }); |
| // Remove them. |
| deadIsolates.forEach((id) { |
| isolates.remove(id); |
| }); |
| // Add new isolates. |
| members.forEach((map) { |
| var id = map['id']; |
| var isolate = isolates[id]; |
| if (isolate == null) { |
| isolate = new Isolate.fromMap(map); |
| isolates[id] = isolate; |
| } |
| isolate.refresh(); |
| }); |
| } |
| } |