about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorJason Toffaletti <jason@topsy.com>2013-10-07 01:17:09 -0700
committerBrian Anderson <banderson@mozilla.com>2013-10-25 18:27:45 -0700
commit1916732cfd7efa916da3877ca6e823d18221b04b (patch)
tree1c14f21bc3267e15d6a5ba7173552fe98dc504c1 /src/libstd
parent89c91208a7e1e2a5ce77dcb2032601393d861128 (diff)
downloadrust-1916732cfd7efa916da3877ca6e823d18221b04b.tar.gz
rust-1916732cfd7efa916da3877ca6e823d18221b04b.zip
fix bug introduced by previous clean up. more clean up.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rt/mpsc_queue.rs42
1 files changed, 19 insertions, 23 deletions
diff --git a/src/libstd/rt/mpsc_queue.rs b/src/libstd/rt/mpsc_queue.rs
index 7dd050f5a0c..e10ec7de017 100644
--- a/src/libstd/rt/mpsc_queue.rs
+++ b/src/libstd/rt/mpsc_queue.rs
@@ -34,9 +34,7 @@ use ptr::{mut_null, to_mut_unsafe_ptr};
 use cast;
 use option::*;
 use clone::Clone;
-use default::Default;
 use kinds::Send;
-use fmt;
 
 struct Node<T> {
     next: AtomicPtr<Node<T>>,
@@ -44,14 +42,12 @@ struct Node<T> {
 }
 
 impl<T> Node<T> {
-    fn new(value: T) -> Node<T> {
-        Node{next: AtomicPtr::new(mut_null()), value: Some(value)}
+    fn empty() -> Node<T> {
+        Node{next: AtomicPtr::new(mut_null()), value: None}
     }
-}
 
-impl<T> Default for Node<T> {
-    fn default() -> Node<T> {
-        Node{next: AtomicPtr::new(mut_null()), value: None}
+    fn with_value(value: T) -> Node<T> {
+        Node{next: AtomicPtr::new(mut_null()), value: Some(value)}
     }
 }
 
@@ -77,27 +73,23 @@ impl<T: Send> Clone for Queue<T> {
     }
 }
 
-impl<T: Send> fmt::Default for Queue<T> {
-    fn fmt(value: &Queue<T>, f: &mut fmt::Formatter) {
-        write!(f.buf, "Queue({})", value.state.get());
-    }
-}
-
 impl<T: Send> State<T> {
     pub fn new() -> State<T> {
-        let mut state = State {
+        State{
             pad0: [0, ..64],
             head: AtomicPtr::new(mut_null()),
             pad1: [0, ..64],
-            stub: Default::default(),
+            stub: Node::<T>::empty(),
             pad2: [0, ..64],
             tail: mut_null(),
             pad3: [0, ..64],
-        };
-        let stub = state.get_stub_unsafe();
-        state.head.store(stub, Relaxed);
-        state.tail = stub;
-        state
+        }
+    }
+
+    fn init(&mut self) {
+        let stub = self.get_stub_unsafe();
+        self.head.store(stub, Relaxed);
+        self.tail = stub;
     }
 
     fn get_stub_unsafe(&mut self) -> *mut Node<T> {
@@ -106,7 +98,7 @@ impl<T: Send> State<T> {
 
     fn push(&mut self, value: T) {
         unsafe {
-            let node = cast::transmute(~Node::new(value));
+            let node = cast::transmute(~Node::with_value(value));
             self.push_node(node);
         }
     }
@@ -155,7 +147,11 @@ impl<T: Send> State<T> {
 
 impl<T: Send> Queue<T> {
     pub fn new() -> Queue<T> {
-        Queue{state: UnsafeArc::new(State::new())}
+        unsafe {
+            let mut q = Queue{state: UnsafeArc::new(State::new())};
+            (*q.state.get()).init();
+            q
+        }
     }
 
     pub fn push(&mut self, value: T) {