diff options
| author | bors <bors@rust-lang.org> | 2013-08-01 07:46:38 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-08-01 07:46:38 -0700 |
| commit | fe28ac6891ae2619094e88d9b7859772e685a27f (patch) | |
| tree | c7e0ccbdf6c36ba41212bf3e8d61947ed6cad843 /src/libstd | |
| parent | 18d124b9b5dcb9915e5e1489eed81ed6a8b90c39 (diff) | |
| parent | ebd14c92f8b15f6d9388ea9bf6f19793a1b77a59 (diff) | |
| download | rust-fe28ac6891ae2619094e88d9b7859772e685a27f.tar.gz rust-fe28ac6891ae2619094e88d9b7859772e685a27f.zip | |
auto merge of #8164 : brson/rust/noportset, r=pcwalton
...haredChan.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/comm.rs | 83 |
1 files changed, 2 insertions, 81 deletions
diff --git a/src/libstd/comm.rs b/src/libstd/comm.rs index 9fe6aa57958..acdf2cee841 100644 --- a/src/libstd/comm.rs +++ b/src/libstd/comm.rs @@ -14,14 +14,10 @@ Message passing #[allow(missing_doc)]; -use cast::{transmute, transmute_mut}; -use container::Container; +use cast::transmute; use either::{Either, Left, Right}; use kinds::Send; -use option::{Option, Some, None}; -use uint; -use vec::OwnedVector; -use util::replace; +use option::{Option, Some}; use unstable::sync::Exclusive; use rtcomm = rt::comm; use rt; @@ -143,81 +139,6 @@ impl<T: Send> Selectable for Port<T> { } } -/// Treat many ports as one. -#[unsafe_mut_field(ports)] -pub struct PortSet<T> { - ports: ~[pipesy::Port<T>], -} - -impl<T: Send> PortSet<T> { - pub fn new() -> PortSet<T> { - PortSet { - ports: ~[] - } - } - - pub fn add(&self, port: Port<T>) { - let Port { inner } = port; - let port = match inner { - Left(p) => p, - Right(_) => fail!("PortSet not implemented") - }; - unsafe { - let self_ports = transmute_mut(&self.ports); - self_ports.push(port) - } - } - - pub fn chan(&self) -> Chan<T> { - let (po, ch) = stream(); - self.add(po); - ch - } -} - -impl<T:Send> GenericPort<T> for PortSet<T> { - fn try_recv(&self) -> Option<T> { - unsafe { - let self_ports = transmute_mut(&self.ports); - let mut result = None; - // we have to swap the ports array so we aren't borrowing - // aliasable mutable memory. - let mut ports = replace(self_ports, ~[]); - while result.is_none() && ports.len() > 0 { - let i = wait_many(ports); - match ports[i].try_recv() { - Some(m) => { - result = Some(m); - } - None => { - // Remove this port. - let _ = ports.swap_remove(i); - } - } - } - *self_ports = ports; - result - } - } - fn recv(&self) -> T { - self.try_recv().expect("port_set: endpoints closed") - } -} - -impl<T: Send> Peekable<T> for PortSet<T> { - fn peek(&self) -> bool { - // It'd be nice to use self.port.each, but that version isn't - // pure. - for uint::range(0, self.ports.len()) |i| { - let port: &pipesy::Port<T> = &self.ports[i]; - if port.peek() { - return true; - } - } - false - } -} - /// A channel that can be shared between many senders. pub struct SharedChan<T> { inner: Either<Exclusive<pipesy::Chan<T>>, rtcomm::SharedChan<T>> |
