Chromium Code Reviews| 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..d2b6020d9e4029e5867315633ddef9c4ec8a65f4 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,28 @@ 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(); |
| + print("IL $isolateList"); |
|
Cutch
2015/08/05 21:41:56
Remove print
|
| + isolateList.sort(_compareIsolates); |
| + isolates.clear(); |
| + isolates.addAll(isolateList); |
| } |
| void _removeDeadIsolates(List newIsolates) { |
| @@ -576,8 +596,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 +618,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 +1221,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 +1271,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 +1592,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]. |