// 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-isolate-groups --experimental-enable-isolate-groups-jit // VMOptions=--no-enable-isolate-groups import 'dart:isolate'; import "package:expect/expect.dart"; import 'package:async_helper/async_helper.dart'; class FromMainIsolate { String toString() => 'from main isolate'; int get fld => 10; } func1Child(args) { var receivePort = new ReceivePort(); var sendPort = args[0]; sendPort.send(receivePort.sendPort); receivePort.listen((msg) { Expect.isTrue(msg is FromMainIsolate); Expect.equals(10, msg.fld); receivePort.close(); sendPort.send("done"); }, onError: (e) => print('$e')); } func2Child(args) { var receivePort = new ReceivePort(); var sendPort = args[0]; sendPort.send(receivePort.sendPort); receivePort.listen((msg) { Expect.isTrue(msg is SendPort); msg.send(new FromMainIsolate()); receivePort.close(); }, onError: (e) => print('$e')); } spawnFuncTest() { var receive1 = new ReceivePort(); var receive2 = new ReceivePort(); var spawnFunctionIsolate1SendPort; var spawnFunctionIsolate2SendPort; // First spawn the first isolate using spawnFunction, this isolate will // create a receivePort and send it's sendPort back and then it will just // sit there listening for a message from the second isolate spawned // using spawnFunction. asyncStart(); return Isolate.spawn(func1Child, [receive1.sendPort]).then((isolate) { receive1.listen((msg) { if (msg is SendPort) { spawnFunctionIsolate1SendPort = msg; // Now spawn the second isolate using spawnFunction, this isolate // will create a receivePort and send it's sendPort back and then // wait for the third isolate spawned using spawnUri to send it // a sendPort to which it will try and send a non "literal-like" // object. Isolate.spawn(func2Child, [receive2.sendPort]).then((isolate) { receive2.listen((msg) { spawnFunctionIsolate2SendPort = msg; receive2.close(); // Now spawn an isolate using spawnUri and send these send // ports over to it. This isolate will send one of the // sendports over to the other. Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [], [spawnFunctionIsolate1SendPort, spawnFunctionIsolate2SendPort]); }, onError: (e) => print('$e')); }); } else if (msg == "done") { receive1.close(); asyncEnd(); } else { Expect.fail("Invalid message received: $msg"); } }, onError: (e) => print('$e')); }); } uriChild(args) { var receivePort = new ReceivePort(); var sendPort = args[0]; sendPort.send(receivePort.sendPort); receivePort.listen((msg) { Expect.isTrue(msg is String); Expect.equals("Invalid Argument(s).", msg); receivePort.close(); sendPort.send("done"); }, onError: (e) => print('$e')); } spawnUriTest() { var receive1 = new ReceivePort(); var receive2 = new ReceivePort(); var spawnFunctionIsolateSendPort; var spawnUriIsolateSendPort; // First spawn the first isolate using spawnFunction, this isolate will // create a receivePort and send it's sendPort back and then it will just // sit there listening for a message from the second isolate spawned // using spawnFunction. asyncStart(); Isolate.spawn(uriChild, [receive1.sendPort]).then((isolate) { receive1.listen((msg) { if (msg is SendPort) { spawnFunctionIsolateSendPort = msg; // Now spawn the second isolate using spawnUri, this isolate // will create a receivePort and send it's sendPort back and then // wait for the third isolate spawned using spawnUri to send it // a sendPort to which it will try and send a non "literal-like" // object. Isolate.spawnUri(Uri.parse('issue_21398_child_isolate11.dart'), [], receive2.sendPort) .then((isolate) { receive2.listen((msg) { spawnUriIsolateSendPort = msg; receive2.close(); // Now spawn an isolate using spawnUri and send these send // ports over to it. This isolate will send one of the // sendports over to the other. Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [], [spawnFunctionIsolateSendPort, spawnUriIsolateSendPort]); }, onError: (e) => print('$e')); }); } else if (msg == "done") { receive1.close(); asyncEnd(); } else { Expect.fail("Invalid message received: $msg"); } }, onError: (e) => print('$e')); }); } main() { spawnFuncTest(); spawnUriTest(); }