|
@@ -21,6 +21,7 @@ namespace Invercargill {
|
|
|
private Tracker<Tout> queue_tracker;
|
|
|
private TransformDelegate<Tin, Tout> transform_func;
|
|
|
private Tracker<Tin> input_tracker;
|
|
|
+ private int remaining_workers;
|
|
|
|
|
|
public ParallelTracker(owned TransformDelegate<Tin, Tout> transform, int workers, Tracker<Tin> input) {
|
|
|
input_tracker = input;
|
|
@@ -28,6 +29,7 @@ namespace Invercargill {
|
|
|
queue_tracker = queue.get_tracker();
|
|
|
this.transform_func = (owned)transform;
|
|
|
|
|
|
+ remaining_workers = workers;
|
|
|
for(int i = 0; i < workers; i++) {
|
|
|
new Thread<bool>(@"Invercargill Parallel Job Thread #$i", do_work);
|
|
|
}
|
|
@@ -41,10 +43,6 @@ namespace Invercargill {
|
|
|
return item;
|
|
|
}
|
|
|
item.complete = true;
|
|
|
- if(!queue.marked_complete) {
|
|
|
- queue.complete();
|
|
|
- }
|
|
|
-
|
|
|
return item;
|
|
|
}
|
|
|
}
|
|
@@ -53,10 +51,17 @@ namespace Invercargill {
|
|
|
var job = next_for_worker();
|
|
|
while(!job.complete) {
|
|
|
var output = transform_func(job.item);
|
|
|
- queue.push(output);
|
|
|
+ queue.push((owned)output);
|
|
|
|
|
|
job = next_for_worker();
|
|
|
}
|
|
|
+
|
|
|
+ lock(remaining_workers) {
|
|
|
+ remaining_workers--;
|
|
|
+ if(remaining_workers == 0) {
|
|
|
+ queue.complete();
|
|
|
+ }
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
|