diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-06-20 18:26:56 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-06-20 18:26:56 -0700 |
| commit | 7a9a6e45911636eae3ec4e1c111bc0e120601a5a (patch) | |
| tree | e17510b6c9e226775774de697d421de3f288d210 /src/libstd | |
| parent | 357f087786cbd6516a38aff800cf9334bc5b85c5 (diff) | |
| download | rust-7a9a6e45911636eae3ec4e1c111bc0e120601a5a.tar.gz rust-7a9a6e45911636eae3ec4e1c111bc0e120601a5a.zip | |
std: Port SharedChan to newsched
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/comm.rs | 40 | ||||
| -rw-r--r-- | 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 7918abe4ae6..00c33c8ab32 100644 --- a/src/libstd/comm.rs +++ b/src/libstd/comm.rs @@ -220,7 +220,7 @@ impl<T: Owned> Peekable<T> for PortSet<T> { /// A channel that can be shared between many senders. pub struct SharedChan<T> { - ch: Exclusive<pipesy::Chan<T>> + inner: Either<Exclusive<pipesy::Chan<T>>, rtcomm::SharedChan<T>> } impl<T: Owned> SharedChan<T> { @@ -228,40 +228,50 @@ impl<T: Owned> SharedChan<T> { pub fn new(c: Chan<T>) -> SharedChan<T> { 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<T: Owned> GenericChan<T> for SharedChan<T> { 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<T: Owned> GenericSmartChan<T> for SharedChan<T> { 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<T: Owned> ::clone::Clone for SharedChan<T> { fn clone(&self) -> SharedChan<T> { - 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 e7f87906fe5..833f25b253c 100644 --- a/src/libstd/rt/task.rs +++ b/src/libstd/rt/task.rs @@ -249,6 +249,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() { let res = do spawntask_try { |
