//! method, and see the method for more information about it. Due to this
//! caveat, this queue may not be appropriate for all use-cases.
-#![experimental]
+#![unstable]
// http://www.1024cores.net/home/lock-free-algorithms
// /queues/non-intrusive-mpsc-node-based-queue
use alloc::boxed::Box;
use core::mem;
+use core::ptr;
use core::cell::UnsafeCell;
-use sync::atomic::{AtomicPtr, Release, Acquire, AcqRel, Relaxed};
+use sync::atomic::{AtomicPtr, Ordering};
/// A result of the `pop` function.
pub enum PopResult<T> {
impl<T> Node<T> {
unsafe fn new(v: Option<T>) -> *mut Node<T> {
mem::transmute(box Node {
- next: AtomicPtr::new(0 as *mut Node<T>),
+ next: AtomicPtr::new(ptr::null_mut()),
value: v,
})
}
pub fn push(&self, t: T) {
unsafe {
let n = Node::new(Some(t));
- let prev = self.head.swap(n, AcqRel);
- (*prev).next.store(n, Release);
+ let prev = self.head.swap(n, Ordering::AcqRel);
+ (*prev).next.store(n, Ordering::Release);
}
}
pub fn pop(&self) -> PopResult<T> {
unsafe {
let tail = *self.tail.get();
- let next = (*tail).next.load(Acquire);
+ let next = (*tail).next.load(Ordering::Acquire);
if !next.is_null() {
*self.tail.get() = next;
return Data(ret);
}
- if self.head.load(Acquire) == tail {Empty} else {Inconsistent}
+ if self.head.load(Ordering::Acquire) == tail {Empty} else {Inconsistent}
}
}
}
#[unsafe_destructor]
+#[stable]
impl<T: Send> Drop for Queue<T> {
fn drop(&mut self) {
unsafe {
let mut cur = *self.tail.get();
while !cur.is_null() {
- let next = (*cur).next.load(Relaxed);
+ let next = (*cur).next.load(Ordering::Relaxed);
let _: Box<Node<T>> = mem::transmute(cur);
cur = next;
}
q.push(i);
}
tx.send(()).unwrap();
- }).detach();
+ });
}
let mut i = 0u;