| Index: runtime/vm/snapshot_test.dart
|
| diff --git a/runtime/vm/snapshot_test.dart b/runtime/vm/snapshot_test.dart
|
| index 91e03e7667c800e13ed403845ccd02420cbb119b..89177bf2a7499e1bb3dfb1e10c44f3c6b5f4d6b8 100644
|
| --- a/runtime/vm/snapshot_test.dart
|
| +++ b/runtime/vm/snapshot_test.dart
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| +// Copyright (c) 2012, 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.
|
|
|
| @@ -1101,10 +1101,8 @@ class PingPongGame {
|
| _pong = null,
|
| _warmedup = false,
|
| _iterations = 0 {
|
| - new Pong().spawn().then((SendPort port) {
|
| - _pong = port;
|
| - play();
|
| - });
|
| + SendPort _pong = spawnFunction(pong);
|
| + play();
|
| }
|
|
|
| void startRound() {
|
| @@ -1159,25 +1157,16 @@ class PingPongGame {
|
| int _iterations;
|
| }
|
|
|
| -class Pong extends Isolate {
|
| -
|
| - // TODO(hpayer): can be removed as soon as we have default constructors
|
| - Pong() : super() { }
|
| -
|
| - void main() {
|
| - this.port.receive((message, SendPort replyTo) {
|
| - if (message == Benchmark1.INIT_MESSAGE) {
|
| - _reply = replyTo;
|
| - _reply.send(message, null);
|
| - } else if (message == Benchmark1.TERMINATION_MESSAGE) {
|
| - this.port.close();
|
| - } else {
|
| - _reply.send(message, null);
|
| - }
|
| - });
|
| - }
|
| -
|
| - SendPort _reply;
|
| +void pong() {
|
| + port.receive((message, SendPort replyTo) {
|
| + if (message == Benchmark1.INIT_MESSAGE) {
|
| + replyTo.send(message, null);
|
| + } else if (message == Benchmark1.TERMINATION_MESSAGE) {
|
| + port.close();
|
| + } else {
|
| + replyTo.send(message, null);
|
| + }
|
| + });
|
| }
|
|
|
|
|
| @@ -1189,469 +1178,59 @@ class ManyGenericInstanceofTest {
|
| }
|
| }
|
|
|
| -// Dart test program for testing that exceptions in other isolates bring down
|
| -// the program.
|
| -// ImportOptions=IsolateTestFramework
|
| -
|
| -class Isolate2NegativeTest extends Isolate {
|
| - Isolate2NegativeTest() : super();
|
| -
|
| - static void testMain() {
|
| - // We will never call 'done'. This test fails with a timeout.
|
| - IsolateTestFramework.waitForDone();
|
| - new Isolate2NegativeTest().spawn();
|
| - }
|
| -
|
| - void main() {
|
| - throw "foo";
|
| - }
|
| -}
|
| -
|
| -
|
| -class IsolateTestFramework {
|
| - static void waitForDone() {
|
| - // By keeping an open receive port we keep the isolate alive. This way we
|
| - // can wait for other isolates to finish before terminating the main
|
| - // isolate.
|
| - _port = new ReceivePort();
|
| - if (waitForDoneCallback !== null) waitForDoneCallback();
|
| - }
|
| - static void done() {
|
| - _port.close();
|
| - if (doneCallback !== null) doneCallback();
|
| - }
|
| -
|
| - static Function waitForDoneCallback;
|
| - static Function doneCallback;
|
| - static ReceivePort _port;
|
| -}
|
| -
|
| -// Dart test program for testing that the exit-handler is executed at the end.
|
| -
|
| -
|
| -class IsolateExitHandlerTest extends Isolate {
|
| - static int counter;
|
| -
|
| - IsolateExitHandlerTest() : super.heavy();
|
| -
|
| - static void testMain() {
|
| - Isolate.setExitHandler(() {
|
| - Expect.equals(1, counter);
|
| - });
|
| - new IsolateExitHandlerTest().spawn().then((SendPort p) {
|
| - p.call("bar").then((msg) {
|
| - counter++;
|
| - });
|
| - });
|
| - }
|
| -
|
| - void main() {
|
| - bool encounteredException = false;
|
| - try {
|
| - Isolate.setExitHandler(() {
|
| - Expect.equals(true, false);
|
| - });
|
| - } catch(var e) {
|
| - encounteredException = true;
|
| - }
|
| - Expect.equals(true, encounteredException);
|
| -
|
| - this.port.receive((ignored, replyTo) {
|
| - replyTo.send("foo", null);
|
| - this.port.close();
|
| - });
|
| - }
|
| -}
|
| -
|
| -
|
| // ---------------------------------------------------------------------------
|
| // THE REST OF THIS FILE COULD BE AUTOGENERATED
|
| // ---------------------------------------------------------------------------
|
|
|
| -
|
| -// ImportOptions=IsolateTestFramework
|
| -
|
| -class SpawnTest {
|
| -
|
| - static void testMain() {
|
| - spawnIsolate();
|
| - }
|
| -
|
| - static void spawnIsolate() {
|
| - IsolateTestFramework.waitForDone();
|
| - SpawnedIsolate isolate = new SpawnedIsolate();
|
| - isolate.spawn().then((SendPort port) {
|
| - port.call(42).then((message) {
|
| - Expect.equals(42, message);
|
| - IsolateTestFramework.done();
|
| - });
|
| - });
|
| - }
|
| -}
|
| -
|
| -class SpawnedIsolate extends Isolate {
|
| -
|
| - SpawnedIsolate() : super() { }
|
| -
|
| - void main() {
|
| - this.port.receive((message, SendPort replyTo) {
|
| - Expect.equals(42, message);
|
| - replyTo.send(42, null);
|
| - this.port.close();
|
| - });
|
| - }
|
| -
|
| -}
|
| -
|
| -// Dart test program for testing that the exit-handler is executed.
|
| -
|
| -
|
| -class IsolateExitHandlerNegativeTest extends Isolate {
|
| - IsolateExitHandlerNegativeTest() : super.heavy();
|
| -
|
| - static void testMain() {
|
| - Isolate.setExitHandler(() {
|
| - Expect.equals(true, false); // <=-------- Should fail here.
|
| - });
|
| - new IsolateExitHandlerNegativeTest().spawn();
|
| - }
|
| -
|
| - void main() {
|
| - this.port.close();
|
| - }
|
| -}
|
| -
|
| -// ImportOptions=IsolateTestFramework
|
| -
|
| -class ConstructorTest extends Isolate {
|
| - final int field;
|
| - ConstructorTest() : super(), field = 499;
|
| -
|
| - void main() {
|
| - IsolateTestFramework.waitForDone();
|
| - this.port.receive((ignoredMessage, reply) {
|
| - reply.send(field, null);
|
| - this.port.close();
|
| - IsolateTestFramework.done();
|
| - });
|
| - }
|
| -
|
| - static void testMain() {
|
| - ConstructorTest test = new ConstructorTest();
|
| - test.spawn().then((SendPort port) {
|
| - port.call("ignored").then((message) {
|
| - Expect.equals(499, message);
|
| - });
|
| - });
|
| - }
|
| -}
|
| -
|
| -// Dart test program for testing isolate communication with
|
| -// simple messages.
|
| -// ImportOptions=IsolateTestFramework
|
| -
|
| -class IsolateTest {
|
| -
|
| - static void testMain() {
|
| - _waitingForDoneCount = 0;
|
| - IsolateTestFramework.waitForDone();
|
| - RequestReplyTest.test();
|
| - CountTest.test();
|
| - StaticStateTest.test();
|
| - }
|
| -
|
| - static void waitForDone() {
|
| - _waitingForDoneCount++;
|
| - }
|
| -
|
| - static void done() {
|
| - if (--_waitingForDoneCount == 0) {
|
| - IsolateTestFramework.done();
|
| - }
|
| - }
|
| -
|
| - static int _waitingForDoneCount;
|
| -}
|
| -
|
| -
|
| // ---------------------------------------------------------------------------
|
| -// Request-reply test.
|
| +// tests/isolate/spawn_test.dart
|
| // ---------------------------------------------------------------------------
|
|
|
| -class RequestReplyTest {
|
| -
|
| - static void test() {
|
| - testCall();
|
| - testSend();
|
| - }
|
| -
|
| - static void testCall() {
|
| - IsolateTest.waitForDone();
|
| - new RequestReplyIsolate().spawn().then((SendPort port) {
|
| - port.call(42).then((message) {
|
| - Expect.equals(42 + 87, message);
|
| - IsolateTest.done();
|
| - });
|
| - });
|
| - }
|
| -
|
| - static void testSend() {
|
| - IsolateTest.waitForDone();
|
| - new RequestReplyIsolate().spawn().then((SendPort port) {
|
| - ReceivePort reply = new ReceivePort();
|
| - port.send(99, reply.toSendPort());
|
| - reply.receive((message, replyTo) {
|
| - Expect.equals(99 + 87, message);
|
| - reply.close();
|
| - IsolateTest.done();
|
| - });
|
| - });
|
| - }
|
| +spawn_test_main() {
|
| + test("spawn a new isolate", () {
|
| + SendPort port = spawnFunction(entry);
|
| + port.call(42).then(expectAsync1((message) {
|
| + Expect.equals(42, message);
|
| + }));
|
| + });
|
| }
|
|
|
| -
|
| -class RequestReplyIsolate extends Isolate {
|
| -
|
| - RequestReplyIsolate() : super() { }
|
| -
|
| - void main() {
|
| - this.port.receive((message, SendPort replyTo) {
|
| - replyTo.send(message + 87, null);
|
| - this.port.close();
|
| - });
|
| - }
|
| -
|
| +void entry() {
|
| + port.receive((message, SendPort replyTo) {
|
| + Expect.equals(42, message);
|
| + replyTo.send(42, null);
|
| + port.close();
|
| + });
|
| }
|
|
|
| -
|
| // ---------------------------------------------------------------------------
|
| -// Simple counting test.
|
| +// tests/isolate/isolate_negative_test.dart
|
| // ---------------------------------------------------------------------------
|
|
|
| -class CountTest {
|
| -
|
| - static int count;
|
| -
|
| - static void test() {
|
| - IsolateTest.waitForDone();
|
| - print("Hello ");
|
| - new CountIsolate().spawn().then((SendPort remote) {
|
| - ReceivePort local = new ReceivePort();
|
| - SendPort reply = local.toSendPort();
|
| -
|
| - local.receive((int message, SendPort replyTo) {
|
| - if (message == -1) {
|
| - Expect.equals(11, count);
|
| - // Close the only ReceivePort to terminate the isolate after the
|
| - // callback returns.
|
| - local.close();
|
| - print("IsolateTest exiting.");
|
| - IsolateTest.done();
|
| - return;
|
| - }
|
| - Expect.equals((count - 1) * 2, message);
|
| - print("IsolateTest: $message");
|
| - remote.send(count++, reply);
|
| - if (count == 10) {
|
| - remote.send(-1, reply);
|
| - }
|
| - });
|
| -
|
| - print("!");
|
| - count = 0;
|
| - remote.send(count++, reply);
|
| - });
|
| - }
|
| +void isolate_negative_entry() {
|
| + port.receive((ignored, replyTo) {
|
| + replyTo.send("foo", null);
|
| + });
|
| }
|
|
|
| -
|
| -class CountIsolate extends Isolate {
|
| -
|
| - CountIsolate() : super() { }
|
| -
|
| - void main() {
|
| - print("World");
|
| - int count = 0;
|
| -
|
| - this.port.receive((int message, SendPort replyTo) {
|
| - print("Remote: $message");
|
| - if (message == -1) {
|
| - Expect.equals(10, count);
|
| - replyTo.send(-1, null);
|
| - // Close the only ReceivePort to terminate the isolate after the
|
| - // callback returns.
|
| - this.port.close();
|
| - print("RemoteRunner exiting.");
|
| - return;
|
| - }
|
| -
|
| - Expect.equals(count, message);
|
| - count++;
|
| - replyTo.send(message * 2, null);
|
| - });
|
| - }
|
| -}
|
| -
|
| -
|
| -
|
| -// ---------------------------------------------------------------------------
|
| -// State state test.
|
| -// ---------------------------------------------------------------------------
|
| -
|
| -class StaticStateTest {
|
| -
|
| - static String state;
|
| -
|
| - static void test() {
|
| - IsolateTest.waitForDone();
|
| - Expect.equals(null, state);
|
| - state = "foo";
|
| - Expect.equals("foo", state);
|
| -
|
| - new StaticStateIsolate().spawn().then((SendPort remote) {
|
| - remote.call("bar").then((reply) {
|
| - Expect.equals("foo", state);
|
| - Expect.equals(null, reply);
|
| -
|
| - state = "baz";
|
| - remote.call("exit").then((reply) {
|
| - Expect.equals("baz", state);
|
| - Expect.equals("bar", reply);
|
| - IsolateTest.done();
|
| - });
|
| - });
|
| - });
|
| - }
|
| -
|
| -}
|
| -
|
| -
|
| -class StaticStateIsolate extends Isolate {
|
| -
|
| - StaticStateIsolate() : super() { }
|
| -
|
| - void main() {
|
| - Expect.equals(null, StaticStateTest.state);
|
| - this.port.receive((var message, SendPort replyTo) {
|
| - String old = StaticStateTest.state;
|
| - StaticStateTest.state = message;
|
| - replyTo.send(old, null);
|
| - if (message == "exit") {
|
| - this.port.close();
|
| - return;
|
| - }
|
| - });
|
| - }
|
| -
|
| -}
|
| -
|
| -
|
| -// Dart test program for testing isolate communication with
|
| -// complex messages.
|
| -// ImportOptions=IsolateTestFramework
|
| -
|
| -
|
| -class IsolateComplexMessagesTest {
|
| -
|
| - static void testMain() {
|
| - LogClient.test();
|
| - }
|
| +isolate_negative_test_main() {
|
| + test("ensure isolate code is executed", () {
|
| + SendPort port = spawnFunction(isolate_negative_entry);
|
| + port.call("foo").then(expectAsync1((message) {
|
| + Expect.equals(true, "Expected fail"); // <=-------- Should fail here.
|
| + }));
|
| + });
|
| }
|
|
|
| -
|
| // ---------------------------------------------------------------------------
|
| -// Log server test.
|
| +// tests/isolate/message_test.dart
|
| // ---------------------------------------------------------------------------
|
|
|
| -class LogClient {
|
| - static void test() {
|
| - IsolateTestFramework.waitForDone();
|
| - new LogIsolate().spawn().then((SendPort remote) {
|
| -
|
| - remote.send(1, null);
|
| - remote.send("Hello", null);
|
| - remote.send("World", null);
|
| - remote.send(const [null, 1, 2, 3, 4], null);
|
| - remote.send(const [1, 2.0, true, false, 0xffffffffff], null);
|
| - remote.send(const ["Hello", "World", 0xffffffffff], null);
|
| - // Shutdown the LogRunner.
|
| - remote.call(-1).then((int message) {
|
| - Expect.equals(6, message);
|
| - });
|
| - IsolateTestFramework.done();
|
| - });
|
| - }
|
| -}
|
| -
|
| -
|
| -class LogIsolate extends Isolate {
|
| - LogIsolate() : super() { }
|
| -
|
| - void main() {
|
| - print("Starting log server.");
|
| -
|
| - int count = 0;
|
| -
|
| - this.port.receive((var message, SendPort replyTo) {
|
| - if (message == -1) {
|
| - this.port.close();
|
| - print("Stopping log server.");
|
| - replyTo.send(count, null);
|
| - } else {
|
| - print("Log ($count) $message");
|
| - switch (count) {
|
| - case 0:
|
| - Expect.equals(1, message);
|
| - break;
|
| - case 1:
|
| - Expect.equals("Hello", message);
|
| - break;
|
| - case 2:
|
| - Expect.equals("World", message);
|
| - break;
|
| - case 3:
|
| - Expect.equals(5, message.length);
|
| - Expect.equals(null, message[0]);
|
| - Expect.equals(1, message[1]);
|
| - Expect.equals(2, message[2]);
|
| - Expect.equals(3, message[3]);
|
| - Expect.equals(4, message[4]);
|
| - break;
|
| - case 4:
|
| - Expect.equals(5, message.length);
|
| - Expect.equals(1, message[0]);
|
| - Expect.equals(2.0, message[1]);
|
| - Expect.equals(true, message[2]);
|
| - Expect.equals(false, message[3]);
|
| - Expect.equals(0xffffffffff, message[4]);
|
| - break;
|
| - case 5:
|
| - Expect.equals(3, message.length);
|
| - Expect.equals("Hello", message[0]);
|
| - Expect.equals("World", message[1]);
|
| - Expect.equals(0xffffffffff, message[2]);
|
| - break;
|
| - }
|
| - count++;
|
| - }
|
| - });
|
| - }
|
| -}
|
| -
|
| -
|
| -// Dart test program for testing serialization of messages.
|
| -// VMOptions=--enable_type_checks --enable_asserts
|
| -// ImportOptions=IsolateTestFramework
|
| -
|
| // ---------------------------------------------------------------------------
|
| // Message passing test.
|
| // ---------------------------------------------------------------------------
|
|
|
| class MessageTest {
|
| - static void testMain() {
|
| - PingPongClient.test();
|
| - }
|
| -
|
| static final List list1 = const ["Hello", "World", "Hello", 0xfffffffffff];
|
| static final List list2 = const [null, list1, list1, list1, list1];
|
| static final List list3 = const [list2, 2.0, true, false, 0xfffffffffff];
|
| @@ -1701,107 +1280,175 @@ class MessageTest {
|
| }
|
| }
|
|
|
| -class PingPongClient {
|
| - static void test() {
|
| - IsolateTestFramework.waitForDone();
|
| - new PingPongServer().spawn().then((SendPort remote) {
|
| -
|
| - // Send objects and receive them back.
|
| - for (int i = 0; i < MessageTest.elms.length; i++) {
|
| - var sentObject = MessageTest.elms[i];
|
| - remote.call(sentObject).then((var receivedObject) {
|
| - MessageTest.VerifyObject(i, receivedObject);
|
| - });
|
| +pingPong() {
|
| + int count = 0;
|
| + port.receive((var message, SendPort replyTo) {
|
| + if (message == -1) {
|
| + port.close();
|
| + replyTo.send(count, null);
|
| + } else {
|
| + // Check if the received object is correct.
|
| + if (count < MessageTest.elms.length) {
|
| + MessageTest.VerifyObject(count, message);
|
| }
|
| + // Bounce the received object back so that the sender
|
| + // can make sure that the object matches.
|
| + replyTo.send(message, null);
|
| + count++;
|
| + }
|
| + });
|
| +}
|
| +
|
| +message_test_main() {
|
| + test("send objects and receive them back", () {
|
| + SendPort remote = spawnFunction(pingPong);
|
| + // Send objects and receive them back.
|
| + for (int i = 0; i < MessageTest.elms.length; i++) {
|
| + var sentObject = MessageTest.elms[i];
|
| + // TODO(asiva): remove this local var idx once thew new for-loop
|
| + // semantics for closures is implemented.
|
| + var idx = i;
|
| + remote.call(sentObject).then(expectAsync1((var receivedObject) {
|
| + MessageTest.VerifyObject(idx, receivedObject);
|
| + }));
|
| + }
|
|
|
| - // Send recursive objects and receive them back.
|
| - List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
|
| - List local_list2 = [null, local_list1, local_list1 ];
|
| - List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
|
| - List sendObject = new List(5);
|
| - sendObject[0] = local_list1;
|
| - sendObject[1] = sendObject;
|
| - sendObject[2] = local_list2;
|
| - sendObject[3] = sendObject;
|
| - sendObject[4] = local_list3;
|
| - remote.call(sendObject).then((var replyObject) {
|
| - Expect.equals(true, sendObject is List);
|
| - Expect.equals(true, replyObject is List);
|
| - Expect.equals(sendObject.length, replyObject.length);
|
| - Expect.equals(true, replyObject[1] === replyObject);
|
| - Expect.equals(true, replyObject[3] === replyObject);
|
| - Expect.equals(true, replyObject[0] === replyObject[2][1]);
|
| - Expect.equals(true, replyObject[0] === replyObject[2][2]);
|
| - Expect.equals(true, replyObject[2] === replyObject[4][0]);
|
| - Expect.equals(true, replyObject[0][0] === replyObject[0][2]);
|
| - // Bigint literals are not canonicalized so do a == check.
|
| - Expect.equals(true, replyObject[0][3] == replyObject[4][4]);
|
| - });
|
| -
|
| - // Shutdown the MessageServer.
|
| - remote.call(-1).then((int message) {
|
| - Expect.equals(MessageTest.elms.length + 1, message);
|
| - IsolateTestFramework.done();
|
| - });
|
| + // Send recursive objects and receive them back.
|
| + List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
|
| + List local_list2 = [null, local_list1, local_list1 ];
|
| + List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
|
| + List sendObject = new List(5);
|
| + sendObject[0] = local_list1;
|
| + sendObject[1] = sendObject;
|
| + sendObject[2] = local_list2;
|
| + sendObject[3] = sendObject;
|
| + sendObject[4] = local_list3;
|
| + remote.call(sendObject).then((var replyObject) {
|
| + Expect.equals(true, sendObject is List);
|
| + Expect.equals(true, replyObject is List);
|
| + Expect.equals(sendObject.length, replyObject.length);
|
| + Expect.equals(true, replyObject[1] === replyObject);
|
| + Expect.equals(true, replyObject[3] === replyObject);
|
| + Expect.equals(true, replyObject[0] === replyObject[2][1]);
|
| + Expect.equals(true, replyObject[0] === replyObject[2][2]);
|
| + Expect.equals(true, replyObject[2] === replyObject[4][0]);
|
| + Expect.equals(true, replyObject[0][0] === replyObject[0][2]);
|
| + // Bigint literals are not canonicalized so do a == check.
|
| + Expect.equals(true, replyObject[0][3] == replyObject[4][4]);
|
| });
|
| - }
|
| +
|
| + // Shutdown the MessageServer.
|
| + remote.call(-1).then(expectAsync1((int message) {
|
| + Expect.equals(MessageTest.elms.length + 1, message);
|
| + }));
|
| + });
|
| }
|
|
|
| -class PingPongServer extends Isolate {
|
| - PingPongServer() : super() {}
|
| +// ---------------------------------------------------------------------------
|
| +// tests/isolate/request_reply_test.dart
|
| +// ---------------------------------------------------------------------------
|
|
|
| - void main() {
|
| - print("Starting server.");
|
| - int count = 0;
|
| - this.port.receive(
|
| - (var message, SendPort replyTo) {
|
| - if (message == -1) {
|
| - this.port.close();
|
| - print("Stopping server.");
|
| - replyTo.send(count, null);
|
| - } else {
|
| - // Check if the received object is correct.
|
| - if (count < MessageTest.elms.length) {
|
| - MessageTest.VerifyObject(count, message);
|
| - }
|
| - // Bounce the received object back so that the sender
|
| - // can make sure that the object matches.
|
| - replyTo.send(message, null);
|
| - count++;
|
| - }
|
| - });
|
| - }
|
| +void request_reply_entry() {
|
| + port.receive((message, SendPort replyTo) {
|
| + replyTo.send(message + 87);
|
| + port.close();
|
| + });
|
| }
|
|
|
| +void request_reply_main() {
|
| + test("call", () {
|
| + SendPort port = spawnFunction(request_reply_entry);
|
| + port.call(42).then(expectAsync1((message) {
|
| + Expect.equals(42 + 87, message);
|
| + }));
|
| + });
|
| +
|
| + test("send", () {
|
| + SendPort port = spawnFunction(request_reply_entry);
|
| + ReceivePort reply = new ReceivePort();
|
| + port.send(99, reply.toSendPort());
|
| + reply.receive(expectAsync2((message, replyTo) {
|
| + Expect.equals(99 + 87, message);
|
| + reply.close();
|
| + }));
|
| + });
|
| +}
|
|
|
| -// ImportOptions=IsolateTestFramework
|
| +// ---------------------------------------------------------------------------
|
| +// tests/isolate/count_test.dart
|
| +// ---------------------------------------------------------------------------
|
|
|
| -class MandelIsolateTest {
|
| +void countMessages() {
|
| + int count = 0;
|
| + port.receive((int message, SendPort replyTo) {
|
| + if (message == -1) {
|
| + Expect.equals(10, count);
|
| + replyTo.send(-1, null);
|
| + port.close();
|
| + return;
|
| + }
|
| + Expect.equals(count, message);
|
| + count++;
|
| + replyTo.send(message * 2, null);
|
| + });
|
| +}
|
|
|
| - static final TERMINATION_MESSAGE = -1;
|
| - static final N = 100;
|
| - static final ISOLATES = 20;
|
| +void count_main() {
|
| + test("count 10 consecutive messages", () {
|
| + int count = 0;
|
| + SendPort remote = spawnFunction(countMessages);
|
| + ReceivePort local = new ReceivePort();
|
| + SendPort reply = local.toSendPort();
|
|
|
| - static void testMain() {
|
| - IsolateTestFramework.waitForDone();
|
| + local.receive(expectAsync2((int message, SendPort replyTo) {
|
| + if (message == -1) {
|
| + Expect.equals(11, count);
|
| + local.close();
|
| + return;
|
| + }
|
| +
|
| + Expect.equals((count - 1) * 2, message);
|
| + remote.send(count++, reply);
|
| + if (count == 10) {
|
| + remote.send(-1, reply);
|
| + }
|
| + }, count: 11));
|
| + remote.send(count++, reply);
|
| + });
|
| +}
|
| +
|
| +
|
| +// ---------------------------------------------------------------------------
|
| +// tests/isolate/mandel_isolate_test.dart
|
| +// ---------------------------------------------------------------------------
|
| +
|
| +final TERMINATION_MESSAGE = -1;
|
| +final N = 100;
|
| +final ISOLATES = 20;
|
| +
|
| +mandel_main() {
|
| + test("Render Mandelbrot in parallel", () {
|
| final state = new MandelbrotState();
|
| + state._validated.future.then(expectAsync1((result) {
|
| + expect(result, isTrue);
|
| + }));
|
| for (int i = 0; i < Math.min(ISOLATES, N); i++) state.startClient(i);
|
| - }
|
| -
|
| + });
|
| }
|
|
|
|
|
| class MandelbrotState {
|
|
|
| MandelbrotState() {
|
| - _result = new List<List<int>>(MandelIsolateTest.N);
|
| - _lineProcessedBy = new List<LineProcessorClient>(MandelIsolateTest.N);
|
| + _result = new List<List<int>>(N);
|
| + _lineProcessedBy = new List<LineProcessorClient>(N);
|
| _sent = 0;
|
| - _missing = MandelIsolateTest.N;
|
| + _missing = N;
|
| + _validated = new Completer<bool>();
|
| }
|
|
|
| void startClient(int id) {
|
| - assert(_sent < MandelIsolateTest.N);
|
| + assert(_sent < N);
|
| final client = new LineProcessorClient(this, id);
|
| client.processLine(_sent++);
|
| }
|
| @@ -1811,119 +1458,100 @@ class MandelbrotState {
|
| _result[y] = line;
|
| _lineProcessedBy[y] = client;
|
|
|
| - if (_sent != MandelIsolateTest.N) {
|
| + if (_sent != N) {
|
| client.processLine(_sent++);
|
| } else {
|
| client.shutdown();
|
| }
|
|
|
| // If all lines have been computed, validate the result.
|
| - if (--_missing == 0) _validateResult();
|
| + if (--_missing == 0) {
|
| + _printResult();
|
| + _validateResult();
|
| + }
|
| }
|
|
|
| void _validateResult() {
|
| // TODO(ngeoffray): Implement this.
|
| - IsolateTestFramework.done();
|
| + _validated.complete(true);
|
| + }
|
| +
|
| + void _printResult() {
|
| + var output = new StringBuffer();
|
| + for (int i = 0; i < _result.length; i++) {
|
| + List<int> line = _result[i];
|
| + for (int j = 0; j < line.length; j++) {
|
| + if (line[j] < 10) output.add("0");
|
| + output.add(line[j]);
|
| + }
|
| + output.add("\n");
|
| + }
|
| + // print(output);
|
| }
|
|
|
| List<List<int>> _result;
|
| List<LineProcessorClient> _lineProcessedBy;
|
| int _sent;
|
| int _missing;
|
| -
|
| + Completer<bool> _validated;
|
| }
|
|
|
|
|
| class LineProcessorClient {
|
|
|
| LineProcessorClient(MandelbrotState this._state, int this._id) {
|
| - _out = new LineProcessor().spawn();
|
| + _port = spawnFunction(processLines);
|
| }
|
|
|
| void processLine(int y) {
|
| - _out.then((SendPort p) {
|
| - p.call(y).then((List<int> message) {
|
| - _state.notifyProcessedLine(this, y, message);
|
| - });
|
| + _port.call(y).then((List<int> message) {
|
| + _state.notifyProcessedLine(this, y, message);
|
| });
|
| }
|
|
|
| void shutdown() {
|
| - _out.then((SendPort p) {
|
| - p.send(MandelIsolateTest.TERMINATION_MESSAGE, null);
|
| - });
|
| + _port.send(TERMINATION_MESSAGE, null);
|
| }
|
|
|
| MandelbrotState _state;
|
| int _id;
|
| - Future<SendPort> _out;
|
| -
|
| + SendPort _port;
|
| }
|
|
|
| +List<int> processLine(int y) {
|
| + double inverseN = 2.0 / N;
|
| + double Civ = y * inverseN - 1.0;
|
| + List<int> result = new List<int>(N);
|
| + for (int x = 0; x < N; x++) {
|
| + double Crv = x * inverseN - 1.5;
|
|
|
| -class LineProcessor extends Isolate {
|
| -
|
| - LineProcessor() : super() { }
|
| -
|
| - void main() {
|
| - this.port.receive((message, SendPort replyTo) {
|
| - if (message == MandelIsolateTest.TERMINATION_MESSAGE) {
|
| - assert(replyTo === null);
|
| - this.port.close();
|
| - } else {
|
| - replyTo.send(_processLine(message), null);
|
| - }
|
| - });
|
| - }
|
| -
|
| - static List<int> _processLine(int y) {
|
| - double inverseN = 2.0 / MandelIsolateTest.N;
|
| - double Civ = y * inverseN - 1.0;
|
| - List<int> result = new List<int>(MandelIsolateTest.N);
|
| - for (int x = 0; x < MandelIsolateTest.N; x++) {
|
| - double Crv = x * inverseN - 1.5;
|
| -
|
| - double Zrv = Crv;
|
| - double Ziv = Civ;
|
| + double Zrv = Crv;
|
| + double Ziv = Civ;
|
|
|
| - double Trv = Crv * Crv;
|
| - double Tiv = Civ * Civ;
|
| + double Trv = Crv * Crv;
|
| + double Tiv = Civ * Civ;
|
|
|
| - int i = 49;
|
| - do {
|
| - Ziv = (Zrv * Ziv) + (Zrv * Ziv) + Civ;
|
| - Zrv = Trv - Tiv + Crv;
|
| + int i = 49;
|
| + do {
|
| + Ziv = (Zrv * Ziv) + (Zrv * Ziv) + Civ;
|
| + Zrv = Trv - Tiv + Crv;
|
|
|
| - Trv = Zrv * Zrv;
|
| - Tiv = Ziv * Ziv;
|
| - } while (((Trv + Tiv) <= 4.0) && (--i > 0));
|
| + Trv = Zrv * Zrv;
|
| + Tiv = Ziv * Ziv;
|
| + } while (((Trv + Tiv) <= 4.0) && (--i > 0));
|
|
|
| - result[x] = i;
|
| - }
|
| - return result;
|
| + result[x] = i;
|
| }
|
| -
|
| + return result;
|
| }
|
|
|
| -// Dart test program for testing that isolates are spawned.
|
| -// ImportOptions=IsolateTestFramework
|
| -
|
| -class IsolateNegativeTest extends Isolate {
|
| - IsolateNegativeTest() : super();
|
| -
|
| - static void testMain() {
|
| - IsolateTestFramework.waitForDone();
|
| - new IsolateNegativeTest().spawn().then((SendPort port) {
|
| - port.call("foo").then((message) {
|
| - Expect.equals(true, false); // <=-------- Should fail here.
|
| - IsolateTestFramework.done();
|
| - });
|
| - });
|
| - }
|
| -
|
| - void main() {
|
| - this.port.receive((ignored, replyTo) {
|
| - replyTo.send("foo", null);
|
| - });
|
| - }
|
| +void processLines() {
|
| + port.receive((message, SendPort replyTo) {
|
| + if (message == TERMINATION_MESSAGE) {
|
| + assert(replyTo == null);
|
| + port.close();
|
| + } else {
|
| + replyTo.send(processLine(message), null);
|
| + }
|
| + });
|
| }
|
|
|