| // Copyright (c) 2020, 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. |
| |
| // SharedObjects=ffi_test_functions |
| // VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit --disable-heap-verification --disable-thread-pool-limit |
| |
| import 'dart:async'; |
| import 'dart:math' as math; |
| |
| import 'package:expect/expect.dart'; |
| |
| import 'test_utils.dart'; |
| |
| // This should be larger than max-new-space-size/tlab-size. |
| const int threadCount = 1000; |
| const int treeHeight = 10; |
| final expectedSum = math.pow(2, treeHeight) - 1; |
| |
| class Worker extends RingElement { |
| final int id; |
| Worker(this.id); |
| |
| Future run(dynamic _, dynamic _2) async { |
| return buildTree(treeHeight).sum; |
| } |
| } |
| |
| main(args) async { |
| // This test tests a custom embedder which installs it's own message handler |
| // and therefore does not use our thread pool implementation. |
| // The test passes `--disable-thread-pool-limit` to similate an embedder which |
| // can use arbitrarily number of threads. |
| // |
| // The VM is responsible for ensuring at most N number of mutator threads can |
| // be actively executing Dart code (if not, too many threads would be fighting |
| // to obtain TLABs and performance would be terrible). |
| |
| final ring = await Ring.create(threadCount); |
| |
| // Let each worker do a lot of allocations: If the VM doesn't limit the number |
| // of concurrent mutators, it would cause the threads to fight over TLABs and |
| // this test would timeout. |
| final results = await ring.run((int id) => Worker(id)); |
| |
| Expect.equals(threadCount, results.length); |
| for (int i = 0; i < threadCount; ++i) { |
| final int sum = results[i]; |
| Expect.equals(expectedSum, sum); |
| } |
| |
| await ring.close(); |
| } |