// 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);
}
