about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/test/bench/task-perf-one-million.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/test/bench/task-perf-one-million.rs b/src/test/bench/task-perf-one-million.rs
new file mode 100644
index 00000000000..98eefbaf06f
--- /dev/null
+++ b/src/test/bench/task-perf-one-million.rs
@@ -0,0 +1,68 @@
+// Test for concurrent tasks
+
+enum msg {
+    ready(comm::chan<msg>),
+    start,
+    done(int),
+}
+
+fn calc(children: uint, parent_ch: comm::chan<msg>) {
+    let port = comm::port();
+    let chan = comm::chan(port);
+    let child_chs = [];
+    let sum = 0;
+
+    iter::repeat (children) {||
+        task::spawn {||
+            calc(0u, chan);
+        };
+    }
+
+    iter::repeat (children) {||
+        alt check comm::recv(port) {
+          ready(child_ch) {
+            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 children = if vec::len(args) == 2u {
+        uint::from_str(args[1])
+    } else {
+        100u
+    };
+    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);
+}
\ No newline at end of file