From 2e4bb2b9e9e10a665e23a34ae60652a90e9a1b82 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Fri, 15 Nov 2013 21:08:31 -0800 Subject: Cell -> Mut switch in comm --- src/libstd/rt/comm.rs | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) (limited to 'src/libstd') diff --git a/src/libstd/rt/comm.rs b/src/libstd/rt/comm.rs index 3089ae2c2d0..077e9ba195b 100644 --- a/src/libstd/rt/comm.rs +++ b/src/libstd/rt/comm.rs @@ -22,11 +22,13 @@ use rt::select::{SelectInner, SelectPortInner}; use select::{Select, SelectPort}; use unstable::atomics::{AtomicUint, AtomicOption, Acquire, Relaxed, SeqCst}; use unstable::sync::UnsafeArc; +use util; use util::Void; use comm::{GenericChan, GenericSmartChan, GenericPort, Peekable, SendDeferred}; use cell::Cell; use clone::Clone; use tuple::ImmutableTuple; +use mutable::Mut; /// A combined refcount / BlockedTask-as-uint pointer. /// @@ -431,28 +433,28 @@ type StreamPortOne = PortOne>; /// A channel with unbounded size. pub struct Chan { - // FIXME #5372. Using Cell because we don't take &mut self - next: Cell> + // FIXME #5372. Using Mut because we don't take &mut self + next: Mut> } /// An port with unbounded size. pub struct Port { - // FIXME #5372. Using Cell because we don't take &mut self - next: Cell> + // FIXME #5372. Using Mut because we don't take &mut self + next: Mut>> } pub fn stream() -> (Port, Chan) { let (pone, cone) = oneshot(); - let port = Port { next: Cell::new(pone) }; - let chan = Chan { next: Cell::new(cone) }; + let port = Port { next: Mut::new(Some(pone)) }; + let chan = Chan { next: Mut::new(cone) }; return (port, chan); } impl Chan { fn try_send_inner(&self, val: T, do_resched: bool) -> bool { - let (next_pone, next_cone) = oneshot(); - let cone = self.next.take(); - self.next.put_back(next_cone); + let (next_pone, mut cone) = oneshot(); + let mut b = self.next.borrow_mut(); + util::swap(&mut cone, b.get()); cone.try_send_inner(StreamPayload { val: val, next: next_pone }, do_resched) } } @@ -489,10 +491,11 @@ impl GenericPort for Port { } fn try_recv(&self) -> Option { - do self.next.take_opt().map_default(None) |pone| { + let mut b = self.next.borrow_mut(); + do b.get().take().map_default(None) |pone| { match pone.try_recv() { Some(StreamPayload { val, next }) => { - self.next.put_back(next); + *b.get() = Some(next); Some(val) } None => None @@ -503,7 +506,7 @@ impl GenericPort for Port { impl Peekable for Port { fn peek(&self) -> bool { - self.next.with_mut_ref(|p| p.peek()) + self.next.map_mut(|p| p.get_mut_ref().peek()) } } @@ -514,18 +517,18 @@ impl Peekable for Port { impl<'self, T: Send> SelectInner for &'self Port { #[inline] fn optimistic_check(&mut self) -> bool { - do self.next.with_mut_ref |pone| { pone.optimistic_check() } + do self.next.map_mut |pone| { pone.get_mut_ref().optimistic_check() } } #[inline] fn block_on(&mut self, sched: &mut Scheduler, task: BlockedTask) -> bool { - let task = Cell::new(task); - do self.next.with_mut_ref |pone| { pone.block_on(sched, task.take()) } + let mut b = self.next.borrow_mut(); + b.get().get_mut_ref().block_on(sched, task) } #[inline] fn unblock_from(&mut self) -> bool { - do self.next.with_mut_ref |pone| { pone.unblock_from() } + do self.next.map_mut |pone| { pone.get_mut_ref().unblock_from() } } } @@ -552,9 +555,10 @@ impl Select for Port { } impl<'self, T: Send> SelectPortInner for &'self Port { fn recv_ready(self) -> Option { - match self.next.take().recv_ready() { + let mut b = self.next.borrow_mut(); + match b.get().take_unwrap().recv_ready() { Some(StreamPayload { val, next }) => { - self.next.put_back(next); + *b.get() = Some(next); Some(val) } None => None @@ -571,7 +575,7 @@ pub struct SharedChan { impl SharedChan { pub fn new(chan: Chan) -> SharedChan { - let next = chan.next.take(); + let next = chan.next.unwrap(); let next = AtomicOption::new(~next); SharedChan { next: UnsafeArc::new(next) } } @@ -625,7 +629,7 @@ pub struct SharedPort { impl SharedPort { pub fn new(port: Port) -> SharedPort { // Put the data port into a new link pipe - let next_data_port = port.next.take(); + let next_data_port = port.next.unwrap().unwrap(); let (next_link_port, next_link_chan) = oneshot(); next_link_chan.send(next_data_port); let next_link = AtomicOption::new(~next_link_port); -- cgit 1.4.1-3-g733a5