diff options
| author | Jason Toffaletti <jason@topsy.com> | 2013-10-07 01:17:09 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-10-25 18:27:45 -0700 |
| commit | 1916732cfd7efa916da3877ca6e823d18221b04b (patch) | |
| tree | 1c14f21bc3267e15d6a5ba7173552fe98dc504c1 /src/libstd/rt | |
| parent | 89c91208a7e1e2a5ce77dcb2032601393d861128 (diff) | |
| download | rust-1916732cfd7efa916da3877ca6e823d18221b04b.tar.gz rust-1916732cfd7efa916da3877ca6e823d18221b04b.zip | |
fix bug introduced by previous clean up. more clean up.
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/mpsc_queue.rs | 42 |
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) { |
