| Index: runtime/observatory/lib/src/service/object.dart
|
| diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
|
| index 9124595ca4155d06eb3c969d2fe2ae286a56d57a..1c6fc0f68b0e326851d3bc2144851b5cd9e2200f 100644
|
| --- a/runtime/observatory/lib/src/service/object.dart
|
| +++ b/runtime/observatory/lib/src/service/object.dart
|
| @@ -506,7 +506,8 @@ abstract class VM extends ServiceObjectOwner {
|
| final ObservableMap<String,Isolate> _isolateCache =
|
| new ObservableMap<String,Isolate>();
|
|
|
| - @reflectable Iterable<Isolate> get isolates => _isolateCache.values;
|
| + // The list of live isolates, ordered by isolate start time.
|
| + final ObservableList<Isolate> isolates = new ObservableList<Isolate>();
|
|
|
| @observable String version = 'unknown';
|
| @observable String targetCPU;
|
| @@ -547,7 +548,8 @@ abstract class VM extends ServiceObjectOwner {
|
| var isolate = getFromMap(map['isolate']);
|
| event = new ServiceObject._fromMap(isolate, map);
|
| if (event.kind == ServiceEvent.kIsolateExit) {
|
| - _removeIsolate(isolate.id);
|
| + _isolateCache.remove(isolate.id);
|
| + _buildIsolateList();
|
| }
|
| }
|
| var eventStream = _eventStreams[streamId];
|
| @@ -558,10 +560,27 @@ abstract class VM extends ServiceObjectOwner {
|
| }
|
| }
|
|
|
| - void _removeIsolate(String isolateId) {
|
| - assert(_isolateCache.containsKey(isolateId));
|
| - _isolateCache.remove(isolateId);
|
| - notifyPropertyChange(#isolates, true, false);
|
| + int _compareIsolates(Isolate a, Isolate b) {
|
| + var aStart = a.startTime;
|
| + var bStart = b.startTime;
|
| + if (aStart == null) {
|
| + if (bStart == null) {
|
| + return 0;
|
| + } else {
|
| + return 1;
|
| + }
|
| + }
|
| + if (bStart == null) {
|
| + return -1;
|
| + }
|
| + return aStart.compareTo(bStart);
|
| + }
|
| +
|
| + void _buildIsolateList() {
|
| + var isolateList = _isolateCache.values.toList();
|
| + isolateList.sort(_compareIsolates);
|
| + isolates.clear();
|
| + isolates.addAll(isolateList);
|
| }
|
|
|
| void _removeDeadIsolates(List newIsolates) {
|
| @@ -576,8 +595,8 @@ abstract class VM extends ServiceObjectOwner {
|
| toRemove.add(id);
|
| }
|
| });
|
| - toRemove.forEach((id) => _removeIsolate(id));
|
| - notifyPropertyChange(#isolates, true, false);
|
| + toRemove.forEach((id) => _isolateCache.remove(id));
|
| + _buildIsolateList();
|
| }
|
|
|
| static final String _isolateIdPrefix = 'isolates/';
|
| @@ -598,7 +617,7 @@ abstract class VM extends ServiceObjectOwner {
|
| // Add new isolate to the cache.
|
| isolate = new ServiceObject._fromMap(this, map);
|
| _isolateCache[id] = isolate;
|
| - notifyPropertyChange(#isolates, true, false);
|
| + _buildIsolateList();
|
|
|
| // Eagerly load the isolate.
|
| isolate.load().catchError((e, stack) {
|
| @@ -1201,6 +1220,7 @@ class Isolate extends ServiceObjectOwner with Coverage {
|
| if (map['entry'] != null) {
|
| entry = map['entry'];
|
| }
|
| + var savedStartTime = startTime;
|
| var startTimeInMillis = map['startTime'];
|
| startTime = new DateTime.fromMillisecondsSinceEpoch(startTimeInMillis);
|
| notifyPropertyChange(#upTime, 0, 1);
|
| @@ -1250,6 +1270,9 @@ class Isolate extends ServiceObjectOwner with Coverage {
|
| libraries.clear();
|
| libraries.addAll(map['libraries']);
|
| libraries.sort(ServiceObject.LexicalSortName);
|
| + if (savedStartTime == null) {
|
| + vm._buildIsolateList();
|
| + }
|
| }
|
|
|
| Future<TagProfile> updateTagProfile() {
|
| @@ -1568,7 +1591,7 @@ class Isolate extends ServiceObjectOwner with Coverage {
|
| return Future.wait([refreshDartMetrics(), refreshNativeMetrics()]);
|
| }
|
|
|
| - String toString() => "Isolate($_id)";
|
| + String toString() => "Isolate($name)";
|
| }
|
|
|
| /// A [ServiceObject] which implements [ObservableMap].
|
|
|