5#ifndef _RTE_STACK_LF_C11_H_
6#define _RTE_STACK_LF_C11_H_
11#ifdef RTE_TOOLCHAIN_MSVC
24 const rte_int128_t *src,
29 return (
int)_InterlockedCompareExchange128(
30 (int64_t
volatile *) dst,
39__rte_stack_lf_elems_count(
struct rte_stack_lf_list *list)
41 return (
unsigned int)rte_atomic_load_explicit(&list->len, rte_memory_order_relaxed);
45__rte_stack_lf_push_elems(
struct rte_stack_lf_list *list,
46 struct rte_stack_lf_elem *first,
47 struct rte_stack_lf_elem *last,
50 struct rte_stack_lf_head old_head;
53 old_head = list->head;
56 struct rte_stack_lf_head new_head;
62 new_head.cnt = old_head.cnt + 1;
64 last->next = old_head.top;
70 (rte_int128_t *)&list->head,
71 (rte_int128_t *)&old_head,
72 (rte_int128_t *)&new_head,
73 1, rte_memory_order_release,
74 rte_memory_order_relaxed);
75 }
while (success == 0);
80 rte_atomic_fetch_add_explicit(&list->len, num, rte_memory_order_release);
84__rte_stack_lf_pop_elems(
struct rte_stack_lf_list *list,
87 struct rte_stack_lf_elem **last)
89 struct rte_stack_lf_head old_head;
94 len = rte_atomic_load_explicit(&list->len, rte_memory_order_relaxed);
102 if (rte_atomic_compare_exchange_weak_explicit(&list->len,
104 rte_memory_order_acquire,
105 rte_memory_order_relaxed))
112 old_head = list->head;
116 struct rte_stack_lf_head new_head;
117 struct rte_stack_lf_elem *tmp;
135 for (i = 0; i < num && tmp != NULL; i++) {
138 obj_table[i] = tmp->data;
148 old_head = list->head;
153 new_head.cnt = old_head.cnt + 1;
170 (rte_int128_t *)&list->head,
171 (rte_int128_t *)&old_head,
172 (rte_int128_t *)&new_head,
173 0, rte_memory_order_relaxed,
174 rte_memory_order_relaxed);
175 }
while (success == 0);
static int rte_atomic128_cmp_exchange(rte_int128_t *dst, rte_int128_t *exp, const rte_int128_t *src, unsigned int weak, int success, int failure)
static void rte_atomic_thread_fence(rte_memory_order memorder)
#define __rte_always_inline
static void rte_prefetch0(const volatile void *p)