|
|
|
@ -88,8 +88,7 @@ ck_hp_fifo_enqueue_mpmc(ck_hp_record_t *record,
|
|
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
|
tail = ck_pr_load_ptr(&fifo->tail);
|
|
|
|
|
ck_hp_set(record, 0, tail);
|
|
|
|
|
ck_pr_fence_store_load();
|
|
|
|
|
ck_hp_set_fence(record, 0, tail);
|
|
|
|
|
if (tail != ck_pr_load_ptr(&fifo->tail))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
@ -119,8 +118,7 @@ ck_hp_fifo_tryenqueue_mpmc(ck_hp_record_t *record,
|
|
|
|
|
ck_pr_fence_store_atomic();
|
|
|
|
|
|
|
|
|
|
tail = ck_pr_load_ptr(&fifo->tail);
|
|
|
|
|
ck_hp_set(record, 0, tail);
|
|
|
|
|
ck_pr_fence_store_load();
|
|
|
|
|
ck_hp_set_fence(record, 0, tail);
|
|
|
|
|
if (tail != ck_pr_load_ptr(&fifo->tail))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
@ -147,14 +145,12 @@ ck_hp_fifo_dequeue_mpmc(ck_hp_record_t *record,
|
|
|
|
|
head = ck_pr_load_ptr(&fifo->head);
|
|
|
|
|
ck_pr_fence_load();
|
|
|
|
|
tail = ck_pr_load_ptr(&fifo->tail);
|
|
|
|
|
ck_hp_set(record, 0, head);
|
|
|
|
|
ck_pr_fence_store_load();
|
|
|
|
|
ck_hp_set_fence(record, 0, head);
|
|
|
|
|
if (head != ck_pr_load_ptr(&fifo->head))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
next = ck_pr_load_ptr(&head->next);
|
|
|
|
|
ck_hp_set(record, 1, next);
|
|
|
|
|
ck_pr_fence_store_load();
|
|
|
|
|
ck_hp_set_fence(record, 1, next);
|
|
|
|
|
if (head != ck_pr_load_ptr(&fifo->head))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
@ -182,14 +178,12 @@ ck_hp_fifo_trydequeue_mpmc(ck_hp_record_t *record,
|
|
|
|
|
head = ck_pr_load_ptr(&fifo->head);
|
|
|
|
|
ck_pr_fence_load();
|
|
|
|
|
tail = ck_pr_load_ptr(&fifo->tail);
|
|
|
|
|
ck_hp_set(record, 0, head);
|
|
|
|
|
ck_pr_fence_store_load();
|
|
|
|
|
ck_hp_set_fence(record, 0, head);
|
|
|
|
|
if (head != ck_pr_load_ptr(&fifo->head))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
next = ck_pr_load_ptr(&head->next);
|
|
|
|
|
ck_hp_set(record, 1, next);
|
|
|
|
|
ck_pr_fence_store_load();
|
|
|
|
|
ck_hp_set_fence(record, 1, next);
|
|
|
|
|
if (head != ck_pr_load_ptr(&fifo->head))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|