I accidentally swapped head/tail load in ck_hp_fifo (not in ck_fifo, however). We must acquire head snapshot before tail snapshot. An example execution history which could cause an incorrect update to occur is below. - tail <- fifo.tail / fifo.head != fifo.tail - dequeue to empty (until final CAS which renders fifo.head = fifo.tail) - head <- fifo.head / (head != tail) - next <- fifo.head->next / next = NULL - As head != tail, update to next pointer (where next is NULL). However, if - head <- fifo.head / (fifo.head != fifo.tail) - dequeue to empty (until final CAS which renders fifo.head = fifo.tail) - tail <- fifo.tail / fifo.head != fifo.tail - next <- fifo.head->next / next = NULL If we caught tail in final transition, the by the time we read next pointer, head would have also changed forcing us to re-read. Thanks to Hendrik Donner for reporting this.ck_pring
parent
f02b87cd65
commit
319872ca8c
Loading…
Reference in new issue