pub struct Queue<T> { /* private fields */ }Expand description
Queue is a lock-free concurrent first-in-first-out container.
Implementations§
source§impl<T: 'static> Queue<T>
impl<T: 'static> Queue<T>
sourcepub fn push_if<F: FnMut(Option<&Entry<T>>) -> bool>(
&self,
val: T,
cond: F
) -> Result<Arc<Entry<T>>, T>
pub fn push_if<F: FnMut(Option<&Entry<T>>) -> bool>( &self, val: T, cond: F ) -> Result<Arc<Entry<T>>, T>
Pushes an instance of T if the newest entry satisfies the given condition.
Errors
Returns an error along with the supplied instance if the condition is not met.
Examples
use scc::Queue;
let queue: Queue<usize> = Queue::default();
queue.push(11);
assert!(queue.push_if(17, |e| e.map_or(false, |x| **x == 11)).is_ok());
assert!(queue.push_if(29, |e| e.map_or(false, |x| **x == 11)).is_err());sourcepub fn peek_with<'b, R, F: FnOnce(Option<&'b Entry<T>>) -> R>(
&self,
reader: F,
barrier: &'b Barrier
) -> R
pub fn peek_with<'b, R, F: FnOnce(Option<&'b Entry<T>>) -> R>( &self, reader: F, barrier: &'b Barrier ) -> R
Peeks the oldest entry with the supplied Barrier.
Examples
use scc::ebr::Barrier;
use scc::Queue;
let queue: Queue<usize> = Queue::default();
assert!(queue.peek_with(|v| v.is_none(), &Barrier::new()));
queue.push(37);
queue.push(3);
assert_eq!(queue.peek_with(|v| **v.unwrap(), &Barrier::new()), 37);source§impl<T> Queue<T>
impl<T> Queue<T>
sourcepub unsafe fn push_unchecked(&self, val: T) -> Arc<Entry<T>>
pub unsafe fn push_unchecked(&self, val: T) -> Arc<Entry<T>>
Pushes an instance of T without checking the lifetime of T.
Returns an Arc holding a strong reference to the newly pushed entry.
Safety
T::drop can be run after the Queue is dropped, therefore it is safe only if T::drop
does not access short-lived data or std::mem::needs_drop is false for T,
Examples
use scc::Queue;
let hello = String::from("hello");
let queue: Queue<&str> = Queue::default();
assert_eq!(unsafe { **queue.push_unchecked(hello.as_str()) }, "hello");sourcepub unsafe fn push_if_unchecked<F: FnMut(Option<&Entry<T>>) -> bool>(
&self,
val: T,
cond: F
) -> Result<Arc<Entry<T>>, T>
pub unsafe fn push_if_unchecked<F: FnMut(Option<&Entry<T>>) -> bool>( &self, val: T, cond: F ) -> Result<Arc<Entry<T>>, T>
Pushes an instance of T if the newest entry satisfies the given condition without
checking the lifetime of T
Errors
Returns an error along with the supplied instance if the condition is not met.
Safety
T::drop can be run after the Queue is dropped, therefore it is safe only if T::drop
does not access short-lived data or std::mem::needs_drop is false for T,
Examples
use scc::Queue;
let hello = String::from("hello");
let queue: Queue<&str> = Queue::default();
assert!(unsafe { queue.push_if_unchecked(hello.as_str(), |e| e.is_none()).is_ok() });sourcepub fn pop(&self) -> Option<Arc<Entry<T>>>
pub fn pop(&self) -> Option<Arc<Entry<T>>>
Pops the oldest entry.
Returns None if the Queue is empty.
Examples
use scc::Queue;
let queue: Queue<usize> = Queue::default();
queue.push(37);
queue.push(3);
queue.push(1);
assert_eq!(queue.pop().map(|e| **e), Some(37));
assert_eq!(queue.pop().map(|e| **e), Some(3));
assert_eq!(queue.pop().map(|e| **e), Some(1));
assert!(queue.pop().is_none());sourcepub fn pop_if<F: FnMut(&Entry<T>) -> bool>(
&self,
cond: F
) -> Result<Option<Arc<Entry<T>>>, Arc<Entry<T>>>
pub fn pop_if<F: FnMut(&Entry<T>) -> bool>( &self, cond: F ) -> Result<Option<Arc<Entry<T>>>, Arc<Entry<T>>>
Pops the oldest entry if the entry satisfies the given condition.
Returns None if the Queue is empty.
Errors
Returns an error along with the oldest entry if the given condition is not met.
Examples
use scc::Queue;
let queue: Queue<usize> = Queue::default();
queue.push(3);
queue.push(1);
assert!(queue.pop_if(|v| **v == 1).is_err());
assert_eq!(queue.pop().map(|e| **e), Some(3));
assert_eq!(queue.pop_if(|v| **v == 1).ok().and_then(|e| e).map(|e| **e), Some(1));