about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-03-14 16:57:48 -0700
committerbors <bors@rust-lang.org>2013-03-14 16:57:48 -0700
commit82f1b2cc9d8a8301bb9945db628a8ff9124c0388 (patch)
tree474c1c77ea3e6f23e82c29a90fc37ba1c9108e01
parent0c7aeddb5fa6ed86f41363b7552ff38aa96a9482 (diff)
parent9c40ebbb9a70b14a87d09bcd873c9c788627b3dc (diff)
downloadrust-82f1b2cc9d8a8301bb9945db628a8ff9124c0388.tar.gz
rust-82f1b2cc9d8a8301bb9945db628a8ff9124c0388.zip
auto merge of #5366 : tedhorst/rust/threadring, r=brson
-rw-r--r--src/test/bench/shootout-threadring.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/test/bench/shootout-threadring.rs b/src/test/bench/shootout-threadring.rs
new file mode 100644
index 00000000000..9eb8a29cec0
--- /dev/null
+++ b/src/test/bench/shootout-threadring.rs
@@ -0,0 +1,74 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Based on threadring.erlang by Jira Isa
+
+fn start(n_tasks: int, token: int) {
+    let mut (p, ch1) = comm::stream();
+    ch1.send(token);
+    //  XXX could not get this to work with a range closure
+    let mut i = 2;
+    while i <= n_tasks {
+        let (next_p, ch) = comm::stream();
+        let imm_i = i;
+        let imm_p = p;
+        do task::spawn {
+            roundtrip(imm_i, n_tasks, &imm_p, &ch);
+        };
+        p = next_p;
+        i += 1;
+    }
+    let imm_p = p;
+    let imm_ch = ch1;
+    do task::spawn {
+        roundtrip(1, n_tasks, &imm_p, &imm_ch);
+    }
+}
+
+fn roundtrip(id: int, n_tasks: int, p: &comm::Port<int>, ch: &comm::Chan<int>) {
+    while (true) {
+        match p.recv() {
+          1 => {
+            io::println(fmt!("%d\n", id));
+            return;
+          }
+          token => {
+            debug!("thread: %d   got token: %d", id, token);
+            ch.send(token - 1);
+            if token <= n_tasks {
+                return;
+            }
+          }
+        }
+    }
+}
+
+fn main() {
+    let args = if os::getenv(~"RUST_BENCH").is_some() {
+        ~[~"", ~"2000000", ~"503"]
+    }
+    else {
+        os::args()
+    };
+    let token = if args.len() > 1u {
+        int::from_str(args[1]).get()
+    }
+    else {
+        1000
+    };
+    let n_tasks = if args.len() > 2u {
+        int::from_str(args[2]).get()
+    }
+    else {
+        503
+    };
+    start(n_tasks, token);
+
+}