Advertisement
Guest User

Untitled

a guest
May 29th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.81 KB | None | 0 0
  1. unsafe fn put(&mut self, item: T) {
  2. let mut position = self.queue.load(Ordering::SeqCst);
  3. let mut i = 0;
  4. let mut on = None;
  5.  
  6. loop {
  7. if self.disposed.load(Ordering::SeqCst) == 1 {
  8. return;
  9. }
  10.  
  11. let n = self.positions.get_unchecked_mut(position&self.mask);
  12. let diff = n.position.load(Ordering::SeqCst);
  13. if diff == 0 {
  14. if self.queue.compare_and_swap(position, position+1, Ordering::SeqCst) == position {
  15. on = Some(n);
  16. break;
  17. }
  18. } else if diff < 0 {
  19. panic!("Ring buffer is in a compromised state in a put.");
  20. } else {
  21. position = self.queue.load(Ordering::SeqCst);
  22. }
  23.  
  24. if i == 10000 {
  25. yield_now();
  26. } else {
  27. i += 1;
  28. }
  29. }
  30.  
  31.  
  32. let mut n = on.unwrap();
  33. n.item = Some(Box::new(item));
  34. n.position.store(position+1, Ordering::SeqCst);
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement