| // Copyright (c) 2021, 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. |
| // |
| // Checks that Kill message (generated for example by Isolate.exit) prevents |
| // any more dart code being executed - in particular when dart code with |
| // Isolate.exit() is invoked from native code, which in turns is invoked |
| // from dart code(hence "sandwich"-test). |
| |
| import 'dart:async'; |
| import 'dart:ffi'; |
| import 'dart:io'; |
| import 'dart:isolate'; |
| |
| import "package:expect/expect.dart"; |
| import '../../../../tests/ffi/dylib_utils.dart'; |
| |
| final ffiTestFunctions = dlopenPlatformSpecific('ffi_test_functions'); |
| |
| final lookupAndCallWorkerThatCallsIsolateExit = |
| ffiTestFunctions.lookupFunction<Void Function(Int64), void Function(int)>( |
| 'IsolateExitTest_LookupAndCallIsolateExit'); |
| |
| @pragma('vm:entry-point') |
| void recurseLookupAndCallWorker(int i) { |
| lookupAndCallWorkerThatCallsIsolateExit(i); |
| print( |
| 'coming back after $i invocation of lookupAndCallWorkerThatCallsIsolateExit'); |
| assert(false); |
| } |
| |
| // This method is looked up and called by ffi method that ignores unwinding |
| // error raised by 'Isolate.exit'. |
| @pragma('vm:entry-point') |
| Never callIsolateExit() { |
| Isolate.exit(); |
| } |
| |
| main(List<String> args) async { |
| if (args.length > 0) { |
| lookupAndCallWorkerThatCallsIsolateExit(4); |
| print('got back'); |
| return; |
| } |
| ProcessResult result = await Process.run( |
| Platform.executable, <String>[Platform.script.toString(), 'worker']); |
| Expect.isTrue(result.exitCode != 0); |
| // The child process should be terminated before it had a chance |
| // to print "got back". |
| Expect.isFalse(result.stdout.contains('got back')); |
| } |