diff --git a/src/libstd/rt/mpsc_queue.rs b/src/libstd/rt/mpsc_queue.rs index 7dd050f5a0cc..e10ec7de0176 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 { next: AtomicPtr>, @@ -44,15 +42,13 @@ struct Node { } impl Node { - fn new(value: T) -> Node { - Node{next: AtomicPtr::new(mut_null()), value: Some(value)} - } -} - -impl Default for Node { - fn default() -> Node { + fn empty() -> Node { Node{next: AtomicPtr::new(mut_null()), value: None} } + + fn with_value(value: T) -> Node { + Node{next: AtomicPtr::new(mut_null()), value: Some(value)} + } } struct State { @@ -77,27 +73,23 @@ impl Clone for Queue { } } -impl fmt::Default for Queue { - fn fmt(value: &Queue, f: &mut fmt::Formatter) { - write!(f.buf, "Queue({})", value.state.get()); - } -} - impl State { pub fn new() -> State { - let mut state = State { + State{ pad0: [0, ..64], head: AtomicPtr::new(mut_null()), pad1: [0, ..64], - stub: Default::default(), + stub: Node::::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 { @@ -106,7 +98,7 @@ impl State { 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 State { impl Queue { pub fn new() -> Queue { - 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) {