OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 import "dart:async"; | 5 import "dart:async"; |
6 import "dart:convert"; | 6 import "dart:convert"; |
7 import "dart:io"; | 7 import "dart:io"; |
8 import "dart:isolate"; | 8 import "dart:isolate"; |
9 | 9 |
10 import "package:args/args.dart"; | 10 import "package:args/args.dart"; |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 files.forEach((File fileEntry) { | 264 files.forEach((File fileEntry) { |
265 // Read file sync, as it only contains 1 object. | 265 // Read file sync, as it only contains 1 object. |
266 String contents = fileEntry.readAsStringSync(); | 266 String contents = fileEntry.readAsStringSync(); |
267 if (contents.length > 0) { | 267 if (contents.length > 0) { |
268 mergeHitmaps(createHitmap(contents, resolver), workerHitmap); | 268 mergeHitmaps(createHitmap(contents, resolver), workerHitmap); |
269 } | 269 } |
270 }); | 270 }); |
271 | 271 |
272 if (env["verbose"]) { | 272 if (env["verbose"]) { |
273 final end = new DateTime.now().millisecondsSinceEpoch; | 273 final end = new DateTime.now().millisecondsSinceEpoch; |
274 print("${msg.workerName}: Finished processing files. " | 274 print("${msg.workerName}: Finished processing ${files.length} files. " |
275 "Took ${end - start} ms."); | 275 "Took ${end - start} ms."); |
276 } | 276 } |
277 | 277 |
278 msg.replyPort.send(new ResultMessage(workerHitmap, resolver.failed)); | 278 msg.replyPort.send(new ResultMessage(workerHitmap, resolver.failed)); |
279 } | 279 } |
280 | 280 |
281 class WorkMessage { | 281 class WorkMessage { |
282 final String workerName; | 282 final String workerName; |
283 final Map environment; | 283 final Map environment; |
284 final List files; | 284 final List files; |
285 final SendPort replyPort; | 285 final SendPort replyPort; |
286 WorkMessage(this.workerName, this.environment, this.files, this.replyPort); | 286 WorkMessage(this.workerName, this.environment, this.files, this.replyPort); |
287 } | 287 } |
288 | 288 |
289 class ResultMessage { | 289 class ResultMessage { |
290 final hitmap; | 290 final hitmap; |
291 final failedResolves; | 291 final failedResolves; |
292 ResultMessage(this.hitmap, this.failedResolves); | 292 ResultMessage(this.hitmap, this.failedResolves); |
293 } | 293 } |
294 | 294 |
295 final env = new Environment(); | 295 final env = new Environment(); |
296 | 296 |
297 List<List> split(List list, int nBuckets) { | 297 List<List> split(List list, int nBuckets) { |
298 // Leftover goes in the last bucket. | |
299 // TODO(16505): Do a fair split. | |
300 var buckets = new List(nBuckets); | 298 var buckets = new List(nBuckets); |
301 var bucketSize = list.length ~/ nBuckets; | 299 var bucketSize = list.length ~/ nBuckets; |
| 300 var leftover = list.length % nBuckets; |
302 var taken = 0; | 301 var taken = 0; |
| 302 var start = 0; |
303 for (int i = 0; i < nBuckets; i++) { | 303 for (int i = 0; i < nBuckets; i++) { |
304 bool lastBucket = i + 1 == nBuckets; | 304 var end = (i < leftover) ? (start + bucketSize + 1) : (start + bucketSize); |
305 var start = i * bucketSize; | |
306 var end = lastBucket ? list.length : start + bucketSize ; | |
307 buckets[i] = list.sublist(start, end); | 305 buckets[i] = list.sublist(start, end); |
308 taken += buckets[i].length; | 306 taken += buckets[i].length; |
| 307 start = end; |
309 } | 308 } |
310 if (taken != list.length) throw "Error splitting"; | 309 if (taken != list.length) throw "Error splitting"; |
311 return buckets; | 310 return buckets; |
312 } | 311 } |
313 | 312 |
314 Future<ResultMessage> spawnWorker(name, environment, files) { | 313 Future<ResultMessage> spawnWorker(name, environment, files) { |
315 RawReceivePort port = new RawReceivePort(); | 314 RawReceivePort port = new RawReceivePort(); |
316 var completer = new Completer(); | 315 var completer = new Completer(); |
317 port.handler = ((ResultMessage msg) { | 316 port.handler = ((ResultMessage msg) { |
318 completer.complete(msg); | 317 completer.complete(msg); |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 } | 493 } |
495 | 494 |
496 try { | 495 try { |
497 env.workers = int.parse("${args["workers"]}"); | 496 env.workers = int.parse("${args["workers"]}"); |
498 } catch (e) { | 497 } catch (e) { |
499 fail("Invalid worker count: $e"); | 498 fail("Invalid worker count: $e"); |
500 } | 499 } |
501 | 500 |
502 env.verbose = args["verbose"]; | 501 env.verbose = args["verbose"]; |
503 } | 502 } |
OLD | NEW |