From 7a9a6e45911636eae3ec4e1c111bc0e120601a5a Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 20 Jun 2013 18:26:56 -0700 Subject: [PATCH] std: Port SharedChan to newsched --- src/libstd/comm.rs | 40 +++++++++++++++++++++++++--------------- src/libstd/rt/task.rs | 12 ++++++++++++ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/libstd/comm.rs b/src/libstd/comm.rs index 7918abe4ae6a..00c33c8ab325 100644 --- a/src/libstd/comm.rs +++ b/src/libstd/comm.rs @@ -220,7 +220,7 @@ impl Peekable for PortSet { /// A channel that can be shared between many senders. pub struct SharedChan { - ch: Exclusive> + inner: Either>, rtcomm::SharedChan> } impl SharedChan { @@ -228,40 +228,50 @@ impl SharedChan { pub fn new(c: Chan) -> SharedChan { let Chan { inner } = c; let c = match inner { - Left(c) => c, - Right(_) => fail!("SharedChan not implemented") + Left(c) => Left(exclusive(c)), + Right(c) => Right(rtcomm::SharedChan::new(c)) }; - SharedChan { ch: exclusive(c) } + SharedChan { inner: c } } } impl GenericChan for SharedChan { fn send(&self, x: T) { - unsafe { - let mut xx = Some(x); - do self.ch.with_imm |chan| { - let x = replace(&mut xx, None); - chan.send(x.unwrap()) + match self.inner { + Left(ref chan) => { + unsafe { + let mut xx = Some(x); + do chan.with_imm |chan| { + let x = replace(&mut xx, None); + chan.send(x.unwrap()) + } + } } + Right(ref chan) => chan.send(x) } } } impl GenericSmartChan for SharedChan { fn try_send(&self, x: T) -> bool { - unsafe { - let mut xx = Some(x); - do self.ch.with_imm |chan| { - let x = replace(&mut xx, None); - chan.try_send(x.unwrap()) + match self.inner { + Left(ref chan) => { + unsafe { + let mut xx = Some(x); + do chan.with_imm |chan| { + let x = replace(&mut xx, None); + chan.try_send(x.unwrap()) + } + } } + Right(ref chan) => chan.try_send(x) } } } impl ::clone::Clone for SharedChan { fn clone(&self) -> SharedChan { - SharedChan { ch: self.ch.clone() } + SharedChan { inner: self.inner.clone() } } } diff --git a/src/libstd/rt/task.rs b/src/libstd/rt/task.rs index e7f87906fe59..833f25b253c0 100644 --- a/src/libstd/rt/task.rs +++ b/src/libstd/rt/task.rs @@ -248,6 +248,18 @@ mod test { } } + #[test] + fn comm_shared_chan() { + use comm::*; + + do run_in_newsched_task() { + let (port, chan) = stream(); + let chan = SharedChan::new(chan); + chan.send(10); + assert!(port.recv() == 10); + } + } + #[test] fn linked_failure() { do run_in_newsched_task() {