mpmc: use i8 to calculate dif

Remove the boundary check introduced by #132
Now it passes full_at_wrapped_pos0.
This commit is contained in:
Toshio Ito 2020-02-15 11:56:18 +09:00 committed by Toshio Ito
parent 98f9636d88
commit 9645a1bd64

View File

@ -479,7 +479,7 @@ unsafe fn dequeue<T>(buffer: *mut Cell<T>, dequeue_pos: &AtomicU8, mask: u8) ->
loop { loop {
cell = buffer.add(usize::from(pos & mask)); cell = buffer.add(usize::from(pos & mask));
let seq = (*cell).sequence.load(Ordering::Acquire); let seq = (*cell).sequence.load(Ordering::Acquire);
let dif = i16::from(seq) - i16::from(pos.wrapping_add(1)); let dif = (seq as i8) - ((pos.wrapping_add(1)) as i8);
if dif == 0 { if dif == 0 {
if dequeue_pos if dequeue_pos
@ -495,14 +495,10 @@ unsafe fn dequeue<T>(buffer: *mut Cell<T>, dequeue_pos: &AtomicU8, mask: u8) ->
} }
} else if dif < 0 { } else if dif < 0 {
return None; return None;
} else {
if pos == 255 && dif == 255 {
return None;
} else { } else {
pos = dequeue_pos.load(Ordering::Relaxed); pos = dequeue_pos.load(Ordering::Relaxed);
} }
} }
}
let data = (*cell).data.as_ptr().read(); let data = (*cell).data.as_ptr().read();
(*cell) (*cell)
@ -523,7 +519,7 @@ unsafe fn enqueue<T>(
loop { loop {
cell = buffer.add(usize::from(pos & mask)); cell = buffer.add(usize::from(pos & mask));
let seq = (*cell).sequence.load(Ordering::Acquire); let seq = (*cell).sequence.load(Ordering::Acquire);
let dif = i16::from(seq) - i16::from(pos); let dif = (seq as i8) - (pos as i8);
if dif == 0 { if dif == 0 {
if enqueue_pos if enqueue_pos