Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unsafe fn put(&mut self, item: T) {
- let mut position = self.queue.load(Ordering::SeqCst);
- let mut i = 0;
- let mut on = None;
- loop {
- if self.disposed.load(Ordering::SeqCst) == 1 {
- return;
- }
- let n = self.positions.get_unchecked_mut(position&self.mask);
- let diff = n.position.load(Ordering::SeqCst);
- if diff == 0 {
- if self.queue.compare_and_swap(position, position+1, Ordering::SeqCst) == position {
- on = Some(n);
- break;
- }
- } else if diff < 0 {
- panic!("Ring buffer is in a compromised state in a put.");
- } else {
- position = self.queue.load(Ordering::SeqCst);
- }
- if i == 10000 {
- yield_now();
- } else {
- i += 1;
- }
- }
- let mut n = on.unwrap();
- n.item = Some(Box::new(item));
- n.position.store(position+1, Ordering::SeqCst);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement