blob: 5750bf438ecc32393904d0a91fbbece06e5ac3d7 [file] [log] [blame]
// Copyright (c) 2022, 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.
// VMOptions=
// VMOptions=--use_compactor
// VMOptions=--use_compactor --force_evacuation
import 'dart:async';
import 'dart:isolate';
import 'package:expect/expect.dart';
import 'helpers.dart';
void main() async {
await testNormalExit();
await testSendAndExit();
await testSendAndExitFinalizer();
print('End of test, shutting down.');
}
final finalizerTokens = <Nonce>{};
void callback(Nonce token) {
print('Running finalizer: token: $token');
finalizerTokens.add(token);
}
void runIsolateAttachFinalizer(Object? message) {
final finalizer = Finalizer<Nonce>(callback);
final value = Nonce(1001);
final token = Nonce(1002);
finalizer.attach(value, token);
final token9 = Nonce(9002);
makeObjectWithFinalizer(finalizer, token9);
if (message == null) {
print('Isolate done.');
return;
}
final list = message as List;
assert(list.length == 2);
final sendPort = list[0] as SendPort;
final tryToSendFinalizer = list[1] as bool;
if (tryToSendFinalizer) {
Expect.throws(() {
// TODO(http://dartbug.com/47777): Send and exit support.
print('Trying to send and exit finalizer.');
Isolate.exit(sendPort, [value, finalizer]);
});
}
print('Isolate sending and exit.');
Isolate.exit(sendPort, [value]);
}
Future testNormalExit() async {
final portExitMessage = ReceivePort();
await Isolate.spawn(
runIsolateAttachFinalizer,
null,
onExit: portExitMessage.sendPort,
);
await portExitMessage.first;
doGC();
await yieldToMessageLoop();
Expect.equals(0, finalizerTokens.length);
}
@pragma('vm:never-inline')
Future<Finalizer?> testSendAndExitHelper(
{bool trySendFinalizer = false}) async {
final port = ReceivePort();
await Isolate.spawn(
runIsolateAttachFinalizer,
[port.sendPort, trySendFinalizer],
);
final message = await port.first as List;
print('Received message ($message).');
final value = message[0] as Nonce;
print('Received value ($value), but now forgetting about it.');
Expect.equals(1, message.length);
// TODO(http://dartbug.com/47777): Send and exit support.
return null;
}
Future testSendAndExit() async {
await testSendAndExitHelper(trySendFinalizer: false);
doGC();
await yieldToMessageLoop();
Expect.equals(0, finalizerTokens.length);
}
Future testSendAndExitFinalizer() async {
final finalizer = await testSendAndExitHelper(trySendFinalizer: true);
// TODO(http://dartbug.com/47777): Send and exit support.
Expect.isNull(finalizer);
}