// 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; for iter::repeat (children) { do task::spawn { calc(0u, chan); }; } for iter::repeat (children) { match comm::recv(port) { ready(child_ch) => { vec::push(child_chs, child_ch); } _ => fail ~"task-perf-one-million failed (port not ready)" } } comm::send(parent_ch, ready(chan)); match comm::recv(port) { start => { for vec::each(child_chs) |child_ch| { comm::send(*child_ch, start); } } _ => fail ~"task-perf-one-million failed (port not in start state)" } for iter::repeat (children) { match comm::recv(port) { done(child_sum) => { sum += child_sum; } _ => fail ~"task-perf-one-million failed (port not done)" } } 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); do task::spawn { calc(children, chan); }; match comm::recv(port) { ready(chan) => { comm::send(chan, start); } _ => fail ~"task-perf-one-million failed (port not ready)" } let sum = match comm::recv(port) { done(sum) => { sum } _ => fail ~"task-perf-one-million failed (port not done)" }; error!("How many tasks? %d tasks.", sum); }