// Test for concurrent tasks enum msg { ready(comm::chan), start, done(int), } fn calc(children: uint, parent_ch: comm::chan) { let port = comm::port(); let chan = comm::chan(port); let mut child_chs = []; let mut sum = 0; iter::repeat (children) {|| task::spawn {|| calc(0u, chan); }; } iter::repeat (children) {|| alt check comm::recv(port) { ready(child_ch) { vec::push(child_chs, child_ch); } } } comm::send(parent_ch, ready(chan)); alt check comm::recv(port) { start { vec::iter (child_chs) { |child_ch| comm::send(child_ch, start); } } } iter::repeat (children) {|| alt check comm::recv(port) { done(child_sum) { sum += child_sum; } } } comm::send(parent_ch, done(sum + 1)); } fn main(args: [str]) { let args = if os::getenv("RUST_BENCH").is_some() { ["", "100000"] } else if args.len() <= 1u { ["", "100"] } else { args }; let children = uint::from_str(args[1]).get(); let port = comm::port(); let chan = comm::chan(port); task::spawn {|| calc(children, chan); }; alt check comm::recv(port) { ready(chan) { comm::send(chan, start); } } let sum = alt check comm::recv(port) { done(sum) { sum } }; #error("How many tasks? %d tasks.", sum); }