37#define XTC_DEQUE_CAP 256
39#define XTC_DEQUE_MASK (XTC_DEQUE_CAP - 1)
41typedef struct xtc_deque {
53 _Atomic int64_t bottom;
54 _Atomic(
void *) buf[XTC_DEQUE_CAP];
61 atomic_store_explicit(&d->top, 0, memory_order_relaxed);
62 atomic_store_explicit(&d->bottom, 0, memory_order_relaxed);
63 for (i = 0; i < XTC_DEQUE_CAP; i++)
64 atomic_store_explicit(&d->buf[i], NULL, memory_order_relaxed);
74 int64_t b = atomic_load_explicit(&d->bottom, memory_order_relaxed);
75 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);
76 if (b - t >= XTC_DEQUE_CAP)
return XTC_E_AGAIN;
77 atomic_store_explicit(&d->buf[b & XTC_DEQUE_MASK], v,
78 memory_order_relaxed);
83 atomic_store_explicit(&d->bottom, b + 1, memory_order_release);
97 int64_t b = atomic_load_explicit(&d->bottom, memory_order_relaxed) - 1;
101 atomic_store_explicit(&d->bottom, b, memory_order_relaxed);
102 atomic_thread_fence(memory_order_seq_cst);
103 t = atomic_load_explicit(&d->top, memory_order_relaxed);
107 atomic_store_explicit(&d->bottom, t, memory_order_relaxed);
111 x = atomic_load_explicit(&d->buf[b & XTC_DEQUE_MASK],
112 memory_order_relaxed);
116 if (!atomic_compare_exchange_strong_explicit(
118 memory_order_seq_cst, memory_order_relaxed))
120 atomic_store_explicit(&d->bottom, b + 1, memory_order_relaxed);
131 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);
135 atomic_thread_fence(memory_order_seq_cst);
136 b = atomic_load_explicit(&d->bottom, memory_order_acquire);
138 if (t >= b)
return NULL;
139 x = atomic_load_explicit(&d->buf[t & XTC_DEQUE_MASK],
140 memory_order_relaxed);
141 if (!atomic_compare_exchange_strong_explicit(
143 memory_order_seq_cst, memory_order_relaxed))
163 while (atomic_load_explicit(&d->bottom, memory_order_relaxed) >
164 atomic_load_explicit(&d->top, memory_order_acquire))
165 if ((x = xtc_deque_steal(d)) != NULL)
177 int64_t b = atomic_load_explicit(&d->bottom, memory_order_acquire);
178 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);