44
55// Dart test program for testing dart:ffi async callbacks.
66//
7- // VMOptions=--experimental-shared-data
8- // VMOptions=--experimental-shared-data --use-slow-path
9- // VMOptions=--experimental-shared-data --use-slow-path --stacktrace-every=100
10- // VMOptions=--experimental-shared-data --dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects
11- // VMOptions=--experimental-shared-data --test_il_serialization
12- // VMOptions=--experimental-shared-data --profiler --profile_vm=true
13- // VMOptions=--experimental-shared-data --profiler --profile_vm=false
7+ // VMOptions=--experimental-shared-data --print-stacktrace-at-throw
8+ // VMOptions=--experimental-shared-data --print-stacktrace-at-throw -- use-slow-path
9+ // VMOptions=--experimental-shared-data --print-stacktrace-at-throw -- use-slow-path --stacktrace-every=100
10+ // VMOptions=--experimental-shared-data --print-stacktrace-at-throw -- dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects
11+ // VMOptions=--experimental-shared-data --print-stacktrace-at-throw -- test_il_serialization
12+ // VMOptions=--experimental-shared-data --print-stacktrace-at-throw -- profiler --profile_vm=true
13+ // VMOptions=--experimental-shared-data --print-stacktrace-at-throw -- profiler --profile_vm=false
1414// SharedObjects=ffi_test_functions
1515
1616import 'dart:async' ;
1717import 'dart:concurrent' ;
1818import 'dart:ffi' ;
1919import 'dart:isolate' ;
20+ import 'package:dart_internal/isolate_group.dart' show IsolateGroup;
2021
2122import 'dart:io' ;
2223
@@ -45,14 +46,6 @@ class NativeLibrary {
4546 late final FnSleepType sleep;
4647
4748 NativeLibrary () {
48- callFunctionOnSameThread = ffiTestFunctions
49- .lookupFunction <FnRunnerNativeType , FnRunnerType >(
50- "CallFunctionOnSameThread" ,
51- );
52- callFunctionOnNewThreadBlocking = ffiTestFunctions
53- .lookupFunction <FnRunnerNativeType , FnRunnerType >(
54- "CallFunctionOnNewThreadBlocking" ,
55- );
5649 callFunctionOnNewThreadNonBlocking = ffiTestFunctions
5750 .lookupFunction <FnRunnerNativeType , FnRunnerType >(
5851 "CallFunctionOnNewThreadNonBlocking" ,
@@ -92,7 +85,6 @@ void simpleFunction(int a, int b) {
9285Future <void > testNativeCallableHelloWorld () async {
9386 mutexCondvar = Mutex ();
9487 conditionVariable = ConditionVariable ();
95- // final callback = NativeCallable<CallbackNativeType>.isolateGroupShared(simpleFunction);
9688 final callback = NativeCallable <CallbackNativeType >.isolateGroupShared (
9789 simpleFunction,
9890 );
@@ -103,7 +95,8 @@ Future<void> testNativeCallableHelloWorld() async {
10395
10496 mutexCondvar.runLocked (() {
10597 while (! resultIsReady) {
106- conditionVariable.wait (mutexCondvar);
98+ conditionVariable.wait (mutexCondvar, 10 * sleepForMs);
99+ Expect .isTrue (resultIsReady);
107100 }
108101 });
109102
@@ -113,16 +106,38 @@ Future<void> testNativeCallableHelloWorld() async {
113106 lib.callFunctionOnNewThreadNonBlocking (1001 , callback.nativeFunction);
114107 mutexCondvar.runLocked (() {
115108 while (! resultIsReady) {
116- conditionVariable.wait (mutexCondvar);
109+ conditionVariable.wait (mutexCondvar, 10 * sleepForMs);
110+ Expect .isTrue (resultIsReady);
117111 }
118112 });
119113 Expect .equals (42 + (1001 * 123 ) * 2 , result);
120114}
121115
116+ void simpleFunctionThatThrows (int a, int b) {
117+ // Complete without notifying mutexCondvar
118+ throw 'hello, world' ;
119+ }
120+
121+ Future <void > testNativeCallableThrows () async {
122+ mutexCondvar = Mutex ();
123+ conditionVariable = ConditionVariable ();
124+ final callback = NativeCallable <CallbackNativeType >.isolateGroupShared (
125+ simpleFunctionThatThrows,
126+ );
127+
128+ result = 42 ;
129+ resultIsReady = false ;
130+ lib.callFunctionOnNewThreadNonBlocking (1001 , callback.nativeFunction);
131+
132+ mutexCondvar.runLocked (() {
133+ conditionVariable.wait (mutexCondvar, 10 * sleepForMs);
134+ Expect .isFalse (resultIsReady);
135+ });
136+ }
137+
122138Future <void > testNativeCallableHelloWorldClosure () async {
123139 mutexCondvar = Mutex ();
124140 conditionVariable = ConditionVariable ();
125- // final callback = NativeCallable<CallbackNativeType>.isolateGroupShared(simpleFunction);
126141 final callback = NativeCallable <CallbackNativeType >.isolateGroupShared ((
127142 int a,
128143 int b,
@@ -213,6 +228,7 @@ main(args, message) async {
213228 lib = NativeLibrary ();
214229 // Simple tests.
215230 await testNativeCallableHelloWorld ();
231+ await testNativeCallableThrows ();
216232 await testNativeCallableHelloWorldClosure ();
217233 testNativeCallableSync ();
218234 testNativeCallableSyncThrows ();
0 commit comments