| // 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. | 
 | // | 
 | // This test ensures that there are no long pauses when sending large objects | 
 | // via exit/send. | 
 |  | 
 | // @dart=2.9 | 
 |  | 
 | import 'dart:async'; | 
 | import 'dart:typed_data'; | 
 | import 'dart:math' as math; | 
 | import 'dart:isolate'; | 
 |  | 
 | import 'latency.dart'; | 
 |  | 
 | main() async { | 
 |   final statsFuture = | 
 |       measureEventLoopLatency(const Duration(milliseconds: 1), 4000, work: () { | 
 |     // Every 1 ms we allocate some objects which may trigger GC some time. | 
 |     for (int i = 0; i < 32; i++) { | 
 |       List.filled(32 * 1024 ~/ 8, null); | 
 |     } | 
 |   }); | 
 |  | 
 |   final result = await compute(() { | 
 |     final l = <dynamic>[]; | 
 |     for (int i = 0; i < 10 * 1000 * 1000; ++i) { | 
 |       l.add(Object()); | 
 |     } | 
 |     return l; | 
 |   }); | 
 |   if (result.length != 10 * 1000 * 1000) throw 'failed'; | 
 |  | 
 |   final stats = await statsFuture; | 
 |   stats.report('IsolateSendExitLatency'); | 
 | } | 
 |  | 
 | Future<T> compute<T>(T Function() fun) { | 
 |   final rp = ReceivePort(); | 
 |   final sp = rp.sendPort; | 
 |   Isolate.spawn((_) { | 
 |     final value = fun(); | 
 |     Isolate.exit(sp, value); | 
 |   }, null); | 
 |   return rp.first.then((t) => t as T); | 
 | } |