Skip to content

Commit 07c451f

Browse files
Revert "[flutter_tools] migrate FlutterView to new vm_service (flutter#55341)" (flutter#55772)
This reverts commit 2e50fd7.
1 parent 2e50fd7 commit 07c451f

File tree

13 files changed

+368
-533
lines changed

13 files changed

+368
-533
lines changed

packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -620,12 +620,13 @@ class FuchsiaDevice extends Device {
620620
// loopback (::1).
621621
final Uri uri = Uri.parse('http://[$_ipv6Loopback]:$port');
622622
final VMService vmService = await VMService.connect(uri);
623-
final List<FlutterView> flutterViews = await vmService.getFlutterViews();
624-
for (final FlutterView flutterView in flutterViews) {
623+
await vmService.getVMOld();
624+
await vmService.refreshViews();
625+
for (final FlutterView flutterView in vmService.vm.views) {
625626
if (flutterView.uiIsolate == null) {
626627
continue;
627628
}
628-
final Uri address = vmService.httpAddress;
629+
final Uri address = flutterView.owner.vmService.httpAddress;
629630
if (flutterView.uiIsolate.name.contains(isolateName)) {
630631
return address.port;
631632
}
@@ -716,12 +717,13 @@ class FuchsiaIsolateDiscoveryProtocol {
716717
continue;
717718
}
718719
}
719-
final List<FlutterView> flutterViews = await service.getFlutterViews();
720-
for (final FlutterView flutterView in flutterViews) {
720+
await service.getVMOld();
721+
await service.refreshViews();
722+
for (final FlutterView flutterView in service.vm.views) {
721723
if (flutterView.uiIsolate == null) {
722724
continue;
723725
}
724-
final Uri address = service.httpAddress;
726+
final Uri address = flutterView.owner.vmService.httpAddress;
725727
if (flutterView.uiIsolate.name.contains(_isolateName)) {
726728
_foundUri.complete(_device.ipv6
727729
? Uri.parse('http://[$_ipv6Loopback]:${address.port}/')

packages/flutter_tools/lib/src/resident_runner.dart

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -233,25 +233,18 @@ class FlutterDevice {
233233
if (vmService == null) {
234234
return;
235235
}
236-
final List<FlutterView> updatedViews = await vmService.getFlutterViews();
237-
_views
238-
..clear()
239-
..addAll(updatedViews);
236+
await flutterDeprecatedVmService.vm.refreshViews(waitForViews: true);
240237
}
241-
final List<FlutterView> _views = <FlutterView>[];
242238

243239
List<FlutterView> get views {
244-
if (vmService == null) {
240+
if (vmService == null || flutterDeprecatedVmService.isClosed) {
245241
return <FlutterView>[];
246242
}
247-
if (viewFilter != null) {
248-
return <FlutterView>[
249-
for (final FlutterView flutterView in views)
250-
if (flutterView.uiIsolate.name.contains(viewFilter))
251-
flutterView
252-
];
253-
}
254-
return _views;
243+
244+
245+
return (viewFilter != null
246+
? flutterDeprecatedVmService.vm.allViewsWithName(viewFilter)
247+
: flutterDeprecatedVmService.vm.views).toList();
255248
}
256249

257250
Future<void> getVMs() => flutterDeprecatedVmService.getVMOld();
@@ -261,32 +254,35 @@ class FlutterDevice {
261254
await device.stopApp(package);
262255
return;
263256
}
264-
await refreshViews();
265-
if (views == null || views.isEmpty) {
257+
final List<FlutterView> flutterViews = views;
258+
if (flutterViews == null || flutterViews.isEmpty) {
266259
return;
267260
}
268261
// If any of the flutter views are paused, we might not be able to
269262
// cleanly exit since the service extension may not have been registered.
270-
for (final FlutterView flutterView in views) {
271-
final vm_service.Isolate isolate = await vmService
272-
.getIsolateOrNull(flutterView.uiIsolate.id);
273-
if (isolate == null) {
274-
continue;
275-
}
276-
if (isPauseEvent(isolate.pauseEvent.kind)) {
277-
await device.stopApp(package);
278-
return;
263+
if (flutterViews.any((FlutterView view) {
264+
return view != null &&
265+
view.uiIsolate != null &&
266+
view.uiIsolate.pauseEvent != null &&
267+
view.uiIsolate.pauseEvent.isPauseEvent;
279268
}
269+
)) {
270+
await device.stopApp(package);
271+
return;
280272
}
281-
for (final FlutterView view in views) {
273+
final List<Future<void>> futures = <Future<void>>[];
274+
for (final FlutterView view in flutterViews) {
282275
if (view != null && view.uiIsolate != null) {
283-
// If successful, there will be no response from flutterExit.
284-
unawaited(vmService.flutterExit(
276+
assert(!view.uiIsolate.pauseEvent.isPauseEvent);
277+
futures.add(vmService.flutterExit(
285278
isolateId: view.uiIsolate.id,
286279
));
287280
}
288281
}
289-
return vmService.onDone;
282+
// The flutterExit message only returns if it fails, so just wait a few
283+
// seconds then assume it worked.
284+
// TODO(ianh): We should make this return once the VM service disconnects.
285+
await Future.wait(futures).timeout(const Duration(seconds: 2), onTimeout: () => <void>[]);
290286
}
291287

292288
Future<Uri> setupDevFS(

packages/flutter_tools/lib/src/run_hot.dart

Lines changed: 73 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,10 @@ class HotRunner extends ResidentRunner {
514514
String reason,
515515
bool benchmarkMode = false,
516516
}) async {
517-
globals.printTrace('Refreshing active FlutterViews before restarting.');
518-
await refreshViews();
517+
if (!_isPaused()) {
518+
globals.printTrace('Refreshing active FlutterViews before restarting.');
519+
await refreshViews();
520+
}
519521

520522
final Stopwatch restartTimer = Stopwatch()..start();
521523
// TODO(aam): Add generator reset logic once we switch to using incremental
@@ -540,36 +542,31 @@ class HotRunner extends ResidentRunner {
540542
// Check if the isolate is paused and resume it.
541543
final List<Future<void>> operations = <Future<void>>[];
542544
for (final FlutterDevice device in flutterDevices) {
543-
final Set<String> uiIsolatesIds = <String>{};
545+
final Set<Isolate> uiIsolates = <Isolate>{};
544546
for (final FlutterView view in device.views) {
545547
if (view.uiIsolate == null) {
546548
continue;
547549
}
548-
uiIsolatesIds.add(view.uiIsolate.id);
550+
uiIsolates.add(view.uiIsolate);
549551
// Reload the isolate.
550-
final Future<vm_service.Isolate> reloadIsolate = device.vmService
551-
.getIsolateOrNull(view.uiIsolate.id);
552-
operations.add(reloadIsolate.then((vm_service.Isolate isolate) async {
553-
if ((isolate != null) && isPauseEvent(isolate.pauseEvent.kind)) {
552+
operations.add(view.uiIsolate.reload().then((ServiceObject _) {
553+
final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent;
554+
if ((pauseEvent != null) && pauseEvent.isPauseEvent) {
554555
// Resume the isolate so that it can be killed by the embedder.
555-
await device.vmService.resume(view.uiIsolate.id);
556+
return device.vmService.resume(view.uiIsolate.id);
556557
}
558+
return null;
557559
}));
558560
}
559-
560561
// The engine handles killing and recreating isolates that it has spawned
561562
// ("uiIsolates"). The isolates that were spawned from these uiIsolates
562563
// will not be restared, and so they must be manually killed.
563-
final vm_service.VM vm = await device.vmService.getVM();
564-
for (final vm_service.IsolateRef isolateRef in vm.isolates) {
565-
if (uiIsolatesIds.contains(isolateRef.id)) {
566-
continue;
564+
for (final Isolate isolate in device?.flutterDeprecatedVmService?.vm?.isolates ?? <Isolate>[]) {
565+
if (!uiIsolates.contains(isolate)) {
566+
operations.add(isolate.invokeRpcRaw('kill', params: <String, dynamic>{
567+
'isolateId': isolate.id,
568+
}));
567569
}
568-
operations.add(device.vmService.kill(isolateRef.id)
569-
.catchError((dynamic error, StackTrace stackTrace) {
570-
// Do nothing on a SentinelException since it means the isolate
571-
// has already been killed.
572-
}, test: (dynamic error) => error is vm_service.SentinelException));
573570
}
574571
}
575572
await Future.wait(operations);
@@ -592,11 +589,13 @@ class HotRunner extends ResidentRunner {
592589
} on vm_service.RPCError {
593590
// Do nothing, we're already subcribed.
594591
}
595-
isolateNotifications.add(
596-
device.vmService.onIsolateEvent.firstWhere((vm_service.Event event) {
597-
return event.kind == vm_service.EventKind.kIsolateRunnable;
598-
}),
599-
);
592+
for (final FlutterView view in device.views) {
593+
isolateNotifications.add(
594+
view.owner.vm.vmService.onIsolateEvent.firstWhere((vm_service.Event event) {
595+
return event.kind == vm_service.EventKind.kIsolateRunnable;
596+
}),
597+
);
598+
}
600599
}
601600
await Future.wait(isolateNotifications);
602601
}
@@ -819,9 +818,11 @@ class HotRunner extends ResidentRunner {
819818

820819
final Stopwatch reloadTimer = Stopwatch()..start();
821820

822-
globals.printTrace('Refreshing active FlutterViews before reloading.');
823-
await refreshVM();
824-
await refreshViews();
821+
if (!_isPaused()) {
822+
globals.printTrace('Refreshing active FlutterViews before reloading.');
823+
await refreshVM();
824+
await refreshViews();
825+
}
825826

826827
final Stopwatch devFSTimer = Stopwatch()..start();
827828
final UpdateFSReport updatedDevFS = await _updateDevFS();
@@ -913,19 +914,27 @@ class HotRunner extends ResidentRunner {
913914
// Record time it took for the VM to reload the sources.
914915
_addBenchmarkData('hotReloadVMReloadMilliseconds', vmReloadTimer.elapsed.inMilliseconds);
915916
final Stopwatch reassembleTimer = Stopwatch()..start();
916-
917-
// Reload the isolate data.
918-
await Future.wait(<Future<void>>[
919-
for (final FlutterDevice device in flutterDevices)
920-
device.refreshViews()
921-
]);
917+
// Reload the isolate.
918+
final List<Future<void>> allDevices = <Future<void>>[];
919+
for (final FlutterDevice device in flutterDevices) {
920+
globals.printTrace('Sending reload events to ${device.device.name}');
921+
final List<Future<ServiceObject>> futuresViews = <Future<ServiceObject>>[];
922+
for (final FlutterView view in device.views) {
923+
globals.printTrace('Sending reload event to "${view.uiIsolate.name}"');
924+
futuresViews.add(view.uiIsolate.reload());
925+
}
926+
allDevices.add(Future.wait(futuresViews).whenComplete(() {
927+
return device.refreshViews();
928+
}));
929+
}
930+
await Future.wait(allDevices);
922931

923932
globals.printTrace('Evicting dirty assets');
924933
await _evictDirtyAssets();
925934

926935
// Check if any isolates are paused and reassemble those
927936
// that aren't.
928-
final Map<FlutterView, vm_service.VmService> reassembleViews = <FlutterView, vm_service.VmService>{};
937+
final List<FlutterView> reassembleViews = <FlutterView>[];
929938
final List<Future<void>> reassembleFutures = <Future<void>>[];
930939
String serviceEventKind;
931940
int pausedIsolatesFound = 0;
@@ -934,20 +943,16 @@ class HotRunner extends ResidentRunner {
934943
for (final FlutterView view in device.views) {
935944
// Check if the isolate is paused, and if so, don't reassemble. Ignore the
936945
// PostPauseEvent event - the client requesting the pause will resume the app.
937-
final vm_service.Isolate isolate = await device.vmService
938-
.getIsolateOrNull(view.uiIsolate.id);
939-
final vm_service.Event pauseEvent = isolate?.pauseEvent;
940-
if (pauseEvent != null
941-
&& isPauseEvent(pauseEvent.kind)
942-
&& pauseEvent.kind != vm_service.EventKind.kPausePostRequest) {
946+
final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent;
947+
if (pauseEvent != null && pauseEvent.isPauseEvent && pauseEvent.kind != ServiceEvent.kPausePostRequest) {
943948
pausedIsolatesFound += 1;
944949
if (serviceEventKind == null) {
945950
serviceEventKind = pauseEvent.kind;
946951
} else if (serviceEventKind != pauseEvent.kind) {
947952
serviceEventKind = ''; // many kinds
948953
}
949954
} else {
950-
reassembleViews[view] = device.vmService;
955+
reassembleViews.add(view);
951956
reassembleFutures.add(device.vmService.flutterReassemble(
952957
isolateId: view.uiIsolate.id,
953958
).catchError((dynamic error) {
@@ -969,7 +974,6 @@ class HotRunner extends ResidentRunner {
969974
assert(reassembleViews.isNotEmpty);
970975

971976
globals.printTrace('Reassembling application');
972-
973977
final Future<void> reassembleFuture = Future.wait<void>(reassembleFutures);
974978
await reassembleFuture.timeout(
975979
const Duration(seconds: 2),
@@ -982,17 +986,14 @@ class HotRunner extends ResidentRunner {
982986
globals.printTrace('This is taking a long time; will now check for paused isolates.');
983987
int postReloadPausedIsolatesFound = 0;
984988
String serviceEventKind;
985-
for (final FlutterView view in reassembleViews.keys) {
986-
final vm_service.Isolate isolate = await reassembleViews[view]
987-
.getIsolateOrNull(view.uiIsolate.id);
988-
if (isolate == null) {
989-
continue;
990-
}
991-
if (isolate.pauseEvent != null && isPauseEvent(isolate.pauseEvent.kind)) {
989+
for (final FlutterView view in reassembleViews) {
990+
await view.uiIsolate.reload();
991+
final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent;
992+
if (pauseEvent != null && pauseEvent.isPauseEvent) {
992993
postReloadPausedIsolatesFound += 1;
993994
if (serviceEventKind == null) {
994-
serviceEventKind = isolate.pauseEvent.kind;
995-
} else if (serviceEventKind != isolate.pauseEvent.kind) {
995+
serviceEventKind = pauseEvent.kind;
996+
} else if (serviceEventKind != pauseEvent.kind) {
996997
serviceEventKind = ''; // many kinds
997998
}
998999
}
@@ -1068,33 +1069,32 @@ class HotRunner extends ResidentRunner {
10681069
}
10691070
assert(serviceEventKind != null);
10701071
switch (serviceEventKind) {
1071-
case vm_service.EventKind.kPauseStart:
1072-
message.write('paused (probably due to --start-paused)');
1073-
break;
1074-
case vm_service.EventKind.kPauseExit:
1075-
message.write('paused because ${ plural ? 'they have' : 'it has' } terminated');
1076-
break;
1077-
case vm_service.EventKind.kPauseBreakpoint:
1078-
message.write('paused in the debugger on a breakpoint');
1079-
break;
1080-
case vm_service.EventKind.kPauseInterrupted:
1081-
message.write('paused due in the debugger');
1082-
break;
1083-
case vm_service.EventKind.kPauseException:
1084-
message.write('paused in the debugger after an exception was thrown');
1085-
break;
1086-
case vm_service.EventKind.kPausePostRequest:
1087-
message.write('paused');
1088-
break;
1089-
case '':
1090-
message.write('paused for various reasons');
1091-
break;
1072+
case ServiceEvent.kPauseStart: message.write('paused (probably due to --start-paused)'); break;
1073+
case ServiceEvent.kPauseExit: message.write('paused because ${ plural ? 'they have' : 'it has' } terminated'); break;
1074+
case ServiceEvent.kPauseBreakpoint: message.write('paused in the debugger on a breakpoint'); break;
1075+
case ServiceEvent.kPauseInterrupted: message.write('paused due in the debugger'); break;
1076+
case ServiceEvent.kPauseException: message.write('paused in the debugger after an exception was thrown'); break;
1077+
case ServiceEvent.kPausePostRequest: message.write('paused'); break;
1078+
case '': message.write('paused for various reasons'); break;
10921079
default:
10931080
message.write('paused');
10941081
}
10951082
return message.toString();
10961083
}
10971084

1085+
bool _isPaused() {
1086+
for (final FlutterDevice device in flutterDevices) {
1087+
for (final FlutterView view in device.views) {
1088+
if (view.uiIsolate != null) {
1089+
final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent;
1090+
if (pauseEvent != null && pauseEvent.isPauseEvent) {
1091+
return true;
1092+
}
1093+
}
1094+
}
1095+
}
1096+
return false;
1097+
}
10981098

10991099
@override
11001100
void printHelp({ @required bool details }) {
@@ -1134,7 +1134,7 @@ class HotRunner extends ResidentRunner {
11341134
}
11351135
for (final String assetPath in device.devFS.assetPathsToEvict) {
11361136
futures.add(
1137-
device.vmService
1137+
device.views.first.uiIsolate.vmService
11381138
.flutterEvictAsset(
11391139
assetPath,
11401140
isolateId: device.views.first.uiIsolate.id,

packages/flutter_tools/lib/src/tracing.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ class Tracing {
5353
}
5454
});
5555
bool done = false;
56-
final List<FlutterView> views = await vmService.getFlutterViews();
57-
for (final FlutterView view in views) {
58-
if (await vmService
56+
for (final FlutterView view in vmService.vm.views) {
57+
if (await view.uiIsolate.vmService
5958
.flutterAlreadyPaintedFirstUsefulFrame(
6059
isolateId: view.uiIsolate.id,
6160
)) {

0 commit comments

Comments
 (0)