about summary refs log tree commit diff
path: root/src/libstd/rt
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2013-11-15 21:08:31 -0800
committerSteven Fackler <sfackler@gmail.com>2013-11-22 21:19:53 -0800
commit2e4bb2b9e9e10a665e23a34ae60652a90e9a1b82 (patch)
treec630df9a2b6c1d649a19a17e257b49bd6fe7a070 /src/libstd/rt
parent18119afbbefccae7d46a981ea11a7e1295fb7867 (diff)
downloadrust-2e4bb2b9e9e10a665e23a34ae60652a90e9a1b82.tar.gz
rust-2e4bb2b9e9e10a665e23a34ae60652a90e9a1b82.zip
Cell -> Mut switch in comm
Diffstat (limited to 'src/libstd/rt')
-rw-r--r--src/libstd/rt/comm.rs44
1 files changed, 24 insertions, 20 deletions
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<T> = PortOne<StreamPayload<T>>;
 
 /// A channel with unbounded size.
 pub struct Chan<T> {
-    // FIXME #5372. Using Cell because we don't take &mut self
-    next: Cell<StreamChanOne<T>>
+    // FIXME #5372. Using Mut because we don't take &mut self
+    next: Mut<StreamChanOne<T>>
 }
 
 /// An port with unbounded size.
 pub struct Port<T> {
-    // FIXME #5372. Using Cell because we don't take &mut self
-    next: Cell<StreamPortOne<T>>
+    // FIXME #5372. Using Mut because we don't take &mut self
+    next: Mut<Option<StreamPortOne<T>>>
 }
 
 pub fn stream<T: Send>() -> (Port<T>, Chan<T>) {
     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<T: Send> Chan<T> {
     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<T: Send> GenericPort<T> for Port<T> {
     }
 
     fn try_recv(&self) -> Option<T> {
-        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<T: Send> GenericPort<T> for Port<T> {
 
 impl<T: Send> Peekable<T> for Port<T> {
     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<T: Send> Peekable<T> for Port<T> {
 impl<'self, T: Send> SelectInner for &'self Port<T> {
     #[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<T: Send> Select for Port<T> { }
 
 impl<'self, T: Send> SelectPortInner<T> for &'self Port<T> {
     fn recv_ready(self) -> Option<T> {
-        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<T> {
 
 impl<T: Send> SharedChan<T> {
     pub fn new(chan: Chan<T>) -> SharedChan<T> {
-        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<T> {
 impl<T: Send> SharedPort<T> {
     pub fn new(port: Port<T>) -> SharedPort<T> {
         // 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);