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