Skip to content

Commit 9382e58

Browse files
ellietteCommit Queue
authored and
Commit Queue
committed
Set requireUserPermissionsToResume based on pause-isolates-on-start and pause-isolates-on-exit flags
Bug: flutter/devtools#7231 Change-Id: I4665cce72ad9b505cbf513ea151698d5de4eb3f5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/360441 Commit-Queue: Elliott Brooks <[email protected]> Reviewed-by: Ben Konyi <[email protected]>
1 parent 51d6170 commit 9382e58

8 files changed

+59
-11
lines changed

pkg/dds/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
and prepared DDS for using `unified_analytics` through the Dart Tooling Daemon.
44
- Internal change: removed `analytics` parameter from the DevTools server `defaultHandler` method.
55
- Updated `README.md` and added contributing guide (`CONTRIBUTING.md`).
6+
- Updated `package:dds_service_extensions` constraint to ^2.0.0.
7+
- Determine default `requireUserPermissionToResume` values from the `pause_isolates_on_start` and `pause_isolates_on_exit` flags.
68

79
# 4.0.0
810
- Updated DDS protocol to version 2.0.

pkg/dds/lib/src/isolate_manager.dart

+50-8
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ class IsolateManager {
280280
);
281281
}
282282
}
283+
await _determineRequireUserPermissionToResumeFromFlags();
283284
_initialized = true;
284285
}
285286

@@ -383,14 +384,10 @@ class IsolateManager {
383384
DartDevelopmentServiceClient client,
384385
json_rpc.Parameters parameters,
385386
) async {
386-
int pauseTypeMask = 0;
387-
if (parameters['onPauseStart'].asBoolOr(false)) {
388-
pauseTypeMask |= PauseTypeMasks.pauseOnStartMask;
389-
}
390-
if (parameters['onPauseExit'].asBoolOr(false)) {
391-
pauseTypeMask |= PauseTypeMasks.pauseOnExitMask;
392-
}
393-
_requireUserPermissionToResumeMask = pauseTypeMask;
387+
_setRequireUserPermissionToResume(
388+
onPauseStart: parameters['onPauseStart'].asBoolOr(false),
389+
onPauseExit: parameters['onPauseExit'].asBoolOr(false),
390+
);
394391

395392
// Check if isolates have been waiting for a user resume and resume any
396393
// isolates that no longer need to wait for a user resume.
@@ -415,6 +412,51 @@ class IsolateManager {
415412
};
416413
}
417414

415+
Future<void> _determineRequireUserPermissionToResumeFromFlags() async {
416+
try {
417+
final result = await dds.vmServiceClient.sendRequest('getFlagList')
418+
as Map<String, dynamic>;
419+
final flagList = FlagList.parse(result);
420+
final flags = flagList!.flags!;
421+
422+
bool? pauseOnStartValue;
423+
bool? pauseOnExitValue;
424+
for (final flag in flags) {
425+
if (flag.name == 'pause_isolates_on_start') {
426+
pauseOnStartValue = flag.valueAsString == 'true';
427+
}
428+
if (flag.name == 'pause_isolates_on_exit') {
429+
pauseOnExitValue = flag.valueAsString == 'true';
430+
}
431+
if (pauseOnStartValue != null && pauseOnExitValue != null) {
432+
break;
433+
}
434+
}
435+
436+
_setRequireUserPermissionToResume(
437+
onPauseStart: pauseOnStartValue ?? false,
438+
onPauseExit: pauseOnExitValue ?? false,
439+
);
440+
} catch (_) {
441+
// Swallow any errors. Otherwise, this will cause initialization to
442+
// silently fail.
443+
}
444+
}
445+
446+
void _setRequireUserPermissionToResume({
447+
required bool onPauseStart,
448+
required bool onPauseExit,
449+
}) {
450+
int pauseTypeMask = 0;
451+
if (onPauseStart) {
452+
pauseTypeMask |= PauseTypeMasks.pauseOnStartMask;
453+
}
454+
if (onPauseExit) {
455+
pauseTypeMask |= PauseTypeMasks.pauseOnExitMask;
456+
}
457+
_requireUserPermissionToResumeMask = pauseTypeMask;
458+
}
459+
418460
Future<Map<String, dynamic>> getCachedCpuSamples(
419461
json_rpc.Parameters parameters) async {
420462
final isolateId = parameters['isolateId'].asString;

pkg/dds/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ dependencies:
1313
async: ^2.4.1
1414
browser_launcher: ^1.0.0
1515
collection: ^1.15.0
16-
dds_service_extensions: ^1.6.0
16+
dds_service_extensions: ^2.0.0
1717
dap: ^1.2.0
1818
extension_discovery: ^2.0.0
1919
devtools_shared: ^8.0.1

pkg/dds/test/client_resume_approvals_approve_then_disconnect_test.dart

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ void fooBar() {
2020
final test = <IsolateTest>[
2121
hasPausedAtStart,
2222
(VmService service, IsolateRef isolate) async {
23+
service.requireUserPermissionToResume(onPauseStart: false);
2324
final isolateId = isolate.id!;
2425
final client1 = await createClient(
2526
service: service,

pkg/dds/test/client_resume_approvals_disconnect_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ final test = <IsolateTest>[
2121
// Multiple clients, disconnect client awaiting approval.
2222
hasPausedAtStart,
2323
(VmService service, IsolateRef isolate) async {
24+
service.requireUserPermissionToResume(onPauseStart: false);
2425
final isolateId = isolate.id!;
2526
final client1 = await createClient(
2627
service: service,
@@ -43,8 +44,7 @@ final test = <IsolateTest>[
4344
await hasPausedAtStart(service, isolate);
4445

4546
// Once client2 disconnects, there are no clients which require resume
46-
// approval. Ensure we resume immediately so we don't deadlock waiting for
47-
// approvals from disconnected clients.
47+
// approval.
4848
await client2.dispose();
4949
},
5050
hasStoppedAtExit,

pkg/dds/test/client_resume_approvals_identical_names_test.dart

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ void fooBar() {
1919
final test = <IsolateTest>[
2020
// Multiple clients, same client names.
2121
(VmService service, IsolateRef isolateRef) async {
22+
service.requireUserPermissionToResume(onPauseStart: false);
2223
// ignore: unused_local_variable
2324
final client1 = await createClient(
2425
service: service,

pkg/dds/test/client_resume_approvals_multiple_names_test.dart

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ void fooBar() {
2121
final test = <IsolateTest>[
2222
// Multiple clients, different client names.
2323
(VmService service, IsolateRef isolateRef) async {
24+
service.requireUserPermissionToResume(onPauseStart: false);
2425
final isolateId = isolateRef.id!;
2526
final client1 = await createClient(
2627
service: service,

pkg/dds/test/client_resume_approvals_name_change_test.dart

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ void fooBar() {
2222
final test = <IsolateTest>[
2323
// Remove required approvals via name change.
2424
(VmService service, IsolateRef isolateRef) async {
25+
service.requireUserPermissionToResume(onPauseStart: false);
2526
final isolateId = isolateRef.id!;
2627

2728
// Create two clients with the same name.

0 commit comments

Comments
 (0)