| 570 | } |
| 571 | |
| 572 | void * |
| 573 | ink_atomiclist_push(InkAtomicList *l, void *item) |
| 574 | { |
| 575 | void **adr_of_next = ADDRESS_OF_NEXT(item, l->offset); |
| 576 | head_p head; |
| 577 | head_p item_pair; |
| 578 | int result = 0; |
| 579 | void *h = nullptr; |
| 580 | do { |
| 581 | INK_QUEUE_LD(head, l->head); |
| 582 | h = FREELIST_POINTER(head); |
| 583 | *adr_of_next = h; |
| 584 | ink_assert(item != TO_PTR(h)); |
| 585 | SET_FREELIST_POINTER_VERSION(item_pair, FROM_PTR(item), FREELIST_VERSION(head)); |
| 586 | INK_MEMORY_BARRIER; |
| 587 | result = ink_atomic_cas(&l->head.data, head.data, item_pair.data); |
| 588 | } while (result == 0); |
| 589 | |
| 590 | return TO_PTR(h); |
| 591 | } |
| 592 | |
| 593 | void * |
| 594 | ink_atomiclist_remove(InkAtomicList *l, void *item) |