std: Port SharedChan to newsched
This commit is contained in:
parent
357f087786
commit
7a9a6e4591
2 changed files with 37 additions and 15 deletions
|
|
@ -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() }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue