dd6dc29c21
This change mechanically copies runtime/tests/vm/dart -> runtime/tests/vm/dart_2 in preparation for the migration of runtime/tests/vm/dart to NNBD. Corresponding statuses in vm.status are duplicated. Added vm_nnbd builder tag for NNBD bots. vm/dart/* tests are allowed to run only on vm_nnbd builders. vm/dart_2/* tests are allowed to run only on non-vm_nnbd builders. Issue: https://github.com/dart-lang/sdk/issues/41314 Change-Id: I079da92da17960605f37c1c0e28e48362b236739 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149485 Reviewed-by: Régis Crelier <regis@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
62 lines
1.8 KiB
Dart
62 lines
1.8 KiB
Dart
// Copyright (c) 2015, 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.
|
|
// VMOptions=--enable-asserts
|
|
|
|
import 'dart:async';
|
|
import 'dart:io';
|
|
import 'dart:isolate';
|
|
|
|
// This test attempts to check that the vm can shutdown cleanly when
|
|
// isolates are starting and stopping.
|
|
//
|
|
// We spawn a set of workers. Each worker will kill its parent
|
|
// worker (if any) and then spawn a child worker. We start these
|
|
// workers in a staggered fashion in an attempt to see a variety of
|
|
// isolate states at the time that this program terminates.
|
|
|
|
trySpawn(Function f, Object o) async {
|
|
try {
|
|
await Isolate.spawn<SendPort>(f, o);
|
|
} catch (e) {
|
|
// Isolate spawning may fail if the program is ending.
|
|
assert(e is IsolateSpawnException);
|
|
}
|
|
}
|
|
|
|
void worker(SendPort parentPort) {
|
|
var port = new RawReceivePort();
|
|
|
|
// This worker will exit when it receives any message.
|
|
port.handler = (_) {
|
|
port.close();
|
|
};
|
|
|
|
// Send a message to terminate our parent isolate.
|
|
if (parentPort != null) {
|
|
parentPort.send(null);
|
|
}
|
|
|
|
// Spawn a child worker.
|
|
trySpawn(worker, port.sendPort);
|
|
}
|
|
|
|
void main() {
|
|
const numWorkers = 50;
|
|
const delay = const Duration(milliseconds: (1000 ~/ numWorkers));
|
|
const exitDelay = const Duration(seconds: 2);
|
|
|
|
// Take about a second to spin up our workers in a staggered
|
|
// fashion. We want to maximize the chance that they will be in a
|
|
// variety of states when the vm shuts down.
|
|
print('Starting ${numWorkers} workers...');
|
|
for (int i = 0; i < numWorkers; i++) {
|
|
trySpawn(worker, null);
|
|
sleep(delay);
|
|
}
|
|
|
|
// Let them spin for a bit before terminating the program.
|
|
print('Waiting for ${exitDelay} before exit...');
|
|
sleep(exitDelay);
|
|
}
|