2736dab879
Fixes https://github.com/dart-lang/sdk/issues/36917 Change-Id: I83ae6ad6afefb62da4228d168bbec805aa74cf92 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/102101 Commit-Queue: Siva Annamalai <asiva@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Zach Anderson <zra@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);
|
|
}
|