Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: tests/isolate/mandel_isolate_test.dart

Issue 27215002: Very simple version of Isolates. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tests/isolate/mandel_isolate_stream_test.dart ('k') | tests/isolate/message2_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library MandelIsolateTest; 5 library MandelIsolateTest;
6 import 'dart:async'; 6 import 'dart:async';
7 import 'dart:isolate'; 7 import 'dart:isolate';
8 import 'dart:math'; 8 import 'dart:math';
9 import '../../pkg/unittest/lib/unittest.dart'; 9 import '../../pkg/unittest/lib/unittest.dart';
10 10
(...skipping 19 matching lines...) Expand all
30 MandelbrotState() { 30 MandelbrotState() {
31 _result = new List<List<int>>(N); 31 _result = new List<List<int>>(N);
32 _lineProcessedBy = new List<LineProcessorClient>(N); 32 _lineProcessedBy = new List<LineProcessorClient>(N);
33 _sent = 0; 33 _sent = 0;
34 _missing = N; 34 _missing = N;
35 _validated = new Completer<bool>(); 35 _validated = new Completer<bool>();
36 } 36 }
37 37
38 void startClient(int id) { 38 void startClient(int id) {
39 assert(_sent < N); 39 assert(_sent < N);
40 final client = new LineProcessorClient(this, id); 40 int line = _sent++;
41 client.processLine(_sent++); 41 LineProcessorClient.create(this, id).then((final client) {
42 client.processLine(line);
43 });
42 } 44 }
43 45
44 void notifyProcessedLine(LineProcessorClient client, int y, List<int> line) { 46 void notifyProcessedLine(LineProcessorClient client, int y, List<int> line) {
45 assert(_result[y] == null); 47 assert(_result[y] == null);
46 _result[y] = line; 48 _result[y] = line;
47 _lineProcessedBy[y] = client; 49 _lineProcessedBy[y] = client;
48 50
49 if (_sent != N) { 51 if (_sent != N) {
50 client.processLine(_sent++); 52 client.processLine(_sent++);
51 } else { 53 } else {
(...skipping 27 matching lines...) Expand all
79 81
80 List<List<int>> _result; 82 List<List<int>> _result;
81 List<LineProcessorClient> _lineProcessedBy; 83 List<LineProcessorClient> _lineProcessedBy;
82 int _sent; 84 int _sent;
83 int _missing; 85 int _missing;
84 Completer<bool> _validated; 86 Completer<bool> _validated;
85 } 87 }
86 88
87 89
88 class LineProcessorClient { 90 class LineProcessorClient {
91 MandelbrotState _state;
92 int _id;
93 SendPort _port;
89 94
90 LineProcessorClient(MandelbrotState this._state, int this._id) { 95 LineProcessorClient(this._state, this._id, this._port);
91 _port = spawnFunction(processLines); 96
97 static Future<LineProcessorClient> create(MandelbrotState state, int id) {
98 ReceivePort reply = new ReceivePort();
99 return Isolate.spawn(processLines, reply.sendPort).then((_) {
100 return reply.first.then((port) {
101 return new LineProcessorClient(state, id, port);
102 });
103 });
92 } 104 }
93 105
94 void processLine(int y) { 106 void processLine(int y) {
95 _port.call(y).then((List<int> message) { 107 ReceivePort reply = new ReceivePort();
108 _port.send([y, reply.sendPort]);
109 reply.first.then((List<int> message) {
96 _state.notifyProcessedLine(this, y, message); 110 _state.notifyProcessedLine(this, y, message);
97 }); 111 });
98 } 112 }
99 113
100 void shutdown() { 114 void shutdown() {
101 _port.send(TERMINATION_MESSAGE, null); 115 _port.send(TERMINATION_MESSAGE);
102 } 116 }
103
104 MandelbrotState _state;
105 int _id;
106 SendPort _port;
107 } 117 }
108 118
109 List<int> processLine(int y) { 119 List<int> processLine(int y) {
110 double inverseN = 2.0 / N; 120 double inverseN = 2.0 / N;
111 double Civ = y * inverseN - 1.0; 121 double Civ = y * inverseN - 1.0;
112 List<int> result = new List<int>(N); 122 List<int> result = new List<int>(N);
113 for (int x = 0; x < N; x++) { 123 for (int x = 0; x < N; x++) {
114 double Crv = x * inverseN - 1.5; 124 double Crv = x * inverseN - 1.5;
115 125
116 double Zrv = Crv; 126 double Zrv = Crv;
117 double Ziv = Civ; 127 double Ziv = Civ;
118 128
119 double Trv = Crv * Crv; 129 double Trv = Crv * Crv;
120 double Tiv = Civ * Civ; 130 double Tiv = Civ * Civ;
121 131
122 int i = 49; 132 int i = 49;
123 do { 133 do {
124 Ziv = (Zrv * Ziv) + (Zrv * Ziv) + Civ; 134 Ziv = (Zrv * Ziv) + (Zrv * Ziv) + Civ;
125 Zrv = Trv - Tiv + Crv; 135 Zrv = Trv - Tiv + Crv;
126 136
127 Trv = Zrv * Zrv; 137 Trv = Zrv * Zrv;
128 Tiv = Ziv * Ziv; 138 Tiv = Ziv * Ziv;
129 } while (((Trv + Tiv) <= 4.0) && (--i > 0)); 139 } while (((Trv + Tiv) <= 4.0) && (--i > 0));
130 140
131 result[x] = i; 141 result[x] = i;
132 } 142 }
133 return result; 143 return result;
134 } 144 }
135 145
136 void processLines() { 146 void processLines(SendPort replyPort) {
137 port.receive((message, SendPort replyTo) { 147 ReceivePort port = new ReceivePort();
138 if (message == TERMINATION_MESSAGE) { 148 port.listen((message) {
139 assert(replyTo == null); 149 if (message != TERMINATION_MESSAGE) {
150 int line = message[0];
151 SendPort replyTo = message[1];
152 replyTo.send(processLine(line));
153 } else {
140 port.close(); 154 port.close();
141 } else {
142 replyTo.send(processLine(message), null);
143 } 155 }
144 }); 156 });
157 replyPort.send(port.sendPort);
145 } 158 }
OLDNEW
« no previous file with comments | « tests/isolate/mandel_isolate_stream_test.dart ('k') | tests/isolate/message2_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698