diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-01-08 18:31:48 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-02-11 16:32:00 -0800 |
| commit | 0a6b9219d180503254b55cfd14cdaf072fb35ac4 (patch) | |
| tree | 11ee47384b4ecaba8004ec5804c97db8782110e2 /src/test | |
| parent | 47ef20014c32443b12a122c0371a87f513830807 (diff) | |
Rewrite channels yet again for upgradeability
This, the Nth rewrite of channels, is not a rewrite of the core logic behind channels, but rather their API usage. In the past, we had the distinction between oneshot, stream, and shared channels, but the most recent rewrite dropped oneshots in favor of streams and shared channels. This distinction of stream vs shared has shown that it's not quite what we'd like either, and this moves the `std::comm` module in the direction of "one channel to rule them all". There now remains only one Chan and one Port. This new channel is actually a hybrid oneshot/stream/shared channel under the hood in order to optimize for the use cases in question. Additionally, this also reduces the cognitive burden of having to choose between a Chan or a SharedChan in an API. My simple benchmarks show no reduction in efficiency over the existing channels today, and a 3x improvement in the oneshot case. I sadly don't have a pre-last-rewrite compiler to test out the old old oneshots, but I would imagine that the performance is comparable, but slightly slower (due to atomic reference counting). This commit also brings the bonus bugfix to channels that the pending queue of messages are all dropped when a Port disappears rather then when both the Port and the Chan disappear.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/bench/msgsend-pipes-shared.rs | 2 | ||||
| -rw-r--r-- | src/test/bench/msgsend-pipes.rs | 2 | ||||
| -rw-r--r-- | src/test/bench/shootout-chameneos-redux.rs | 8 | ||||
| -rw-r--r-- | src/test/bench/shootout-pfib.rs | 6 | ||||
| -rw-r--r-- | src/test/bench/task-perf-linked-failure.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/comm-not-freeze.rs | 2 | ||||
| -rw-r--r-- | src/test/run-pass/hashmap-memory.rs | 8 | ||||
| -rw-r--r-- | src/test/run-pass/task-comm-14.rs | 4 | ||||
| -rw-r--r-- | src/test/run-pass/task-comm-3.rs | 4 | ||||
| -rw-r--r-- | src/test/run-pass/task-comm-6.rs | 2 | ||||
| -rw-r--r-- | src/test/run-pass/task-comm-7.rs | 4 | ||||
| -rw-r--r-- | src/test/run-pass/unique-send-2.rs | 4 | ||||
| -rw-r--r-- | src/test/run-pass/unwind-resource.rs | 8 |
13 files changed, 29 insertions, 29 deletions
diff --git a/src/test/bench/msgsend-pipes-shared.rs b/src/test/bench/msgsend-pipes-shared.rs index aa4e0f1ae58..b766be88d23 100644 --- a/src/test/bench/msgsend-pipes-shared.rs +++ b/src/test/bench/msgsend-pipes-shared.rs @@ -53,7 +53,7 @@ fn server(requests: &Port<request>, responses: &Chan<uint>) { fn run(args: &[~str]) { let (from_child, to_parent) = Chan::new(); - let (from_parent, to_child) = SharedChan::new(); + let (from_parent, to_child) = Chan::new(); let size = from_str::<uint>(args[1]).unwrap(); let workers = from_str::<uint>(args[2]).unwrap(); diff --git a/src/test/bench/msgsend-pipes.rs b/src/test/bench/msgsend-pipes.rs index 6ce0f9de8d0..89e0bcf3326 100644 --- a/src/test/bench/msgsend-pipes.rs +++ b/src/test/bench/msgsend-pipes.rs @@ -67,7 +67,7 @@ fn run(args: &[~str]) { }); from_parent } else { - let (from_parent, to_child) = SharedChan::new(); + let (from_parent, to_child) = Chan::new(); for _ in range(0u, workers) { let to_child = to_child.clone(); let mut builder = task::task(); diff --git a/src/test/bench/shootout-chameneos-redux.rs b/src/test/bench/shootout-chameneos-redux.rs index 7281667e676..5c237b306fb 100644 --- a/src/test/bench/shootout-chameneos-redux.rs +++ b/src/test/bench/shootout-chameneos-redux.rs @@ -100,8 +100,8 @@ fn creature( name: uint, color: color, from_rendezvous: Port<Option<CreatureInfo>>, - to_rendezvous: SharedChan<CreatureInfo>, - to_rendezvous_log: SharedChan<~str> + to_rendezvous: Chan<CreatureInfo>, + to_rendezvous_log: Chan<~str> ) { let mut color = color; let mut creatures_met = 0; @@ -137,8 +137,8 @@ fn creature( fn rendezvous(nn: uint, set: ~[color]) { // these ports will allow us to hear from the creatures - let (from_creatures, to_rendezvous) = SharedChan::<CreatureInfo>::new(); - let (from_creatures_log, to_rendezvous_log) = SharedChan::<~str>::new(); + let (from_creatures, to_rendezvous) = Chan::<CreatureInfo>::new(); + let (from_creatures_log, to_rendezvous_log) = Chan::<~str>::new(); // these channels will be passed to the creatures so they can talk to us diff --git a/src/test/bench/shootout-pfib.rs b/src/test/bench/shootout-pfib.rs index 86a2043527e..7f4fd3cf94c 100644 --- a/src/test/bench/shootout-pfib.rs +++ b/src/test/bench/shootout-pfib.rs @@ -28,13 +28,13 @@ use std::task; use std::uint; fn fib(n: int) -> int { - fn pfib(c: &SharedChan<int>, n: int) { + fn pfib(c: &Chan<int>, n: int) { if n == 0 { c.send(0); } else if n <= 2 { c.send(1); } else { - let (pp, cc) = SharedChan::new(); + let (pp, cc) = Chan::new(); let ch = cc.clone(); task::spawn(proc() pfib(&ch, n - 1)); let ch = cc.clone(); @@ -43,7 +43,7 @@ fn fib(n: int) -> int { } } - let (p, ch) = SharedChan::new(); + let (p, ch) = Chan::new(); let _t = task::spawn(proc() pfib(&ch, n) ); p.recv() } diff --git a/src/test/bench/task-perf-linked-failure.rs b/src/test/bench/task-perf-linked-failure.rs index 2a012ef19fa..189a3ac7448 100644 --- a/src/test/bench/task-perf-linked-failure.rs +++ b/src/test/bench/task-perf-linked-failure.rs @@ -33,7 +33,7 @@ // Creates in the background 'num_tasks' tasks, all blocked forever. // Doesn't return until all such tasks are ready, but doesn't block forever itself. -use std::comm::{stream, SharedChan}; +use std::comm::{stream, Chan}; use std::os; use std::result; use std::task; @@ -41,7 +41,7 @@ use std::uint; fn grandchild_group(num_tasks: uint) { let (po, ch) = stream(); - let ch = SharedChan::new(ch); + let ch = Chan::new(ch); for _ in range(0, num_tasks) { let ch = ch.clone(); diff --git a/src/test/compile-fail/comm-not-freeze.rs b/src/test/compile-fail/comm-not-freeze.rs index 2b85068d470..ef5bd21f913 100644 --- a/src/test/compile-fail/comm-not-freeze.rs +++ b/src/test/compile-fail/comm-not-freeze.rs @@ -13,5 +13,5 @@ fn test<T: Freeze>() {} fn main() { test::<Chan<int>>(); //~ ERROR: does not fulfill `Freeze` test::<Port<int>>(); //~ ERROR: does not fulfill `Freeze` - test::<SharedChan<int>>(); //~ ERROR: does not fulfill `Freeze` + test::<Chan<int>>(); //~ ERROR: does not fulfill `Freeze` } diff --git a/src/test/run-pass/hashmap-memory.rs b/src/test/run-pass/hashmap-memory.rs index b15c3dca855..9c05dae46bd 100644 --- a/src/test/run-pass/hashmap-memory.rs +++ b/src/test/run-pass/hashmap-memory.rs @@ -31,7 +31,7 @@ mod map_reduce { enum ctrl_proto { find_reducer(~[u8], Chan<int>), mapper_done, } - fn start_mappers(ctrl: SharedChan<ctrl_proto>, inputs: ~[~str]) { + fn start_mappers(ctrl: Chan<ctrl_proto>, inputs: ~[~str]) { for i in inputs.iter() { let ctrl = ctrl.clone(); let i = i.clone(); @@ -39,11 +39,11 @@ mod map_reduce { } } - fn map_task(ctrl: SharedChan<ctrl_proto>, input: ~str) { + fn map_task(ctrl: Chan<ctrl_proto>, input: ~str) { let mut intermediates = HashMap::new(); fn emit(im: &mut HashMap<~str, int>, - ctrl: SharedChan<ctrl_proto>, key: ~str, + ctrl: Chan<ctrl_proto>, key: ~str, _val: ~str) { if im.contains_key(&key) { return; @@ -63,7 +63,7 @@ mod map_reduce { } pub fn map_reduce(inputs: ~[~str]) { - let (ctrl_port, ctrl_chan) = SharedChan::new(); + let (ctrl_port, ctrl_chan) = Chan::new(); // This task becomes the master control task. It spawns others // to do the rest. diff --git a/src/test/run-pass/task-comm-14.rs b/src/test/run-pass/task-comm-14.rs index b51f626f3c2..0403284e55f 100644 --- a/src/test/run-pass/task-comm-14.rs +++ b/src/test/run-pass/task-comm-14.rs @@ -13,7 +13,7 @@ use std::task; pub fn main() { - let (po, ch) = SharedChan::new(); + let (po, ch) = Chan::new(); // Spawn 10 tasks each sending us back one int. let mut i = 10; @@ -37,7 +37,7 @@ pub fn main() { info!("main thread exiting"); } -fn child(x: int, ch: &SharedChan<int>) { +fn child(x: int, ch: &Chan<int>) { info!("{}", x); ch.send(x); } diff --git a/src/test/run-pass/task-comm-3.rs b/src/test/run-pass/task-comm-3.rs index 049f2d71946..f5374e7df05 100644 --- a/src/test/run-pass/task-comm-3.rs +++ b/src/test/run-pass/task-comm-3.rs @@ -16,7 +16,7 @@ use std::task; pub fn main() { info!("===== WITHOUT THREADS ====="); test00(); } -fn test00_start(ch: &SharedChan<int>, message: int, count: int) { +fn test00_start(ch: &Chan<int>, message: int, count: int) { info!("Starting test00_start"); let mut i: int = 0; while i < count { @@ -33,7 +33,7 @@ fn test00() { info!("Creating tasks"); - let (po, ch) = SharedChan::new(); + let (po, ch) = Chan::new(); let mut i: int = 0; diff --git a/src/test/run-pass/task-comm-6.rs b/src/test/run-pass/task-comm-6.rs index 45994e78d94..c63bf8bc856 100644 --- a/src/test/run-pass/task-comm-6.rs +++ b/src/test/run-pass/task-comm-6.rs @@ -15,7 +15,7 @@ pub fn main() { test00(); } fn test00() { let mut r: int = 0; let mut sum: int = 0; - let (p, ch) = SharedChan::new(); + let (p, ch) = Chan::new(); let mut c0 = ch.clone(); let mut c1 = ch.clone(); let mut c2 = ch.clone(); diff --git a/src/test/run-pass/task-comm-7.rs b/src/test/run-pass/task-comm-7.rs index 159962e1857..ff43a80adac 100644 --- a/src/test/run-pass/task-comm-7.rs +++ b/src/test/run-pass/task-comm-7.rs @@ -18,7 +18,7 @@ use std::task; pub fn main() { test00(); } -fn test00_start(c: &SharedChan<int>, start: int, +fn test00_start(c: &Chan<int>, start: int, number_of_messages: int) { let mut i: int = 0; while i < number_of_messages { c.send(start + i); i += 1; } @@ -27,7 +27,7 @@ fn test00_start(c: &SharedChan<int>, start: int, fn test00() { let mut r: int = 0; let mut sum: int = 0; - let (p, ch) = SharedChan::new(); + let (p, ch) = Chan::new(); let number_of_messages: int = 10; let c = ch.clone(); diff --git a/src/test/run-pass/unique-send-2.rs b/src/test/run-pass/unique-send-2.rs index d1c45a336fa..299fed735ab 100644 --- a/src/test/run-pass/unique-send-2.rs +++ b/src/test/run-pass/unique-send-2.rs @@ -10,12 +10,12 @@ use std::task; -fn child(c: &SharedChan<~uint>, i: uint) { +fn child(c: &Chan<~uint>, i: uint) { c.send(~i); } pub fn main() { - let (p, ch) = SharedChan::new(); + let (p, ch) = Chan::new(); let n = 100u; let mut expected = 0u; for i in range(0u, n) { diff --git a/src/test/run-pass/unwind-resource.rs b/src/test/run-pass/unwind-resource.rs index 4679f65c43c..e643a20436e 100644 --- a/src/test/run-pass/unwind-resource.rs +++ b/src/test/run-pass/unwind-resource.rs @@ -15,7 +15,7 @@ extern mod extra; use std::task; struct complainer { - c: SharedChan<bool>, + c: Chan<bool>, } impl Drop for complainer { @@ -26,20 +26,20 @@ impl Drop for complainer { } } -fn complainer(c: SharedChan<bool>) -> complainer { +fn complainer(c: Chan<bool>) -> complainer { error!("Hello!"); complainer { c: c } } -fn f(c: SharedChan<bool>) { +fn f(c: Chan<bool>) { let _c = complainer(c); fail!(); } pub fn main() { - let (p, c) = SharedChan::new(); + let (p, c) = Chan::new(); task::spawn(proc() f(c.clone())); error!("hiiiiiiiii"); assert!(p.recv()); |
