32#define XTC_DEQUE_CAP 256
33#define XTC_DEQUE_MASK (XTC_DEQUE_CAP - 1)
35typedef struct xtc_deque {
47 _Atomic int64_t bottom;
48 _Atomic(
void *) buf[XTC_DEQUE_CAP];
55 atomic_store_explicit(&d->top, 0, memory_order_relaxed);
56 atomic_store_explicit(&d->bottom, 0, memory_order_relaxed);
57 for (i = 0; i < XTC_DEQUE_CAP; i++)
58 atomic_store_explicit(&d->buf[i], NULL, memory_order_relaxed);
68 int64_t b = atomic_load_explicit(&d->bottom, memory_order_relaxed);
69 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);
70 if (b - t >= XTC_DEQUE_CAP)
return XTC_E_AGAIN;
71 atomic_store_explicit(&d->buf[b & XTC_DEQUE_MASK], v,
72 memory_order_relaxed);
73 atomic_thread_fence(memory_order_release);
74 atomic_store_explicit(&d->bottom, b + 1, memory_order_relaxed);
88 int64_t b = atomic_load_explicit(&d->bottom, memory_order_relaxed) - 1;
92 atomic_store_explicit(&d->bottom, b, memory_order_relaxed);
93 atomic_thread_fence(memory_order_seq_cst);
94 t = atomic_load_explicit(&d->top, memory_order_relaxed);
98 atomic_store_explicit(&d->bottom, t, memory_order_relaxed);
102 x = atomic_load_explicit(&d->buf[b & XTC_DEQUE_MASK],
103 memory_order_relaxed);
107 if (!atomic_compare_exchange_strong_explicit(
109 memory_order_seq_cst, memory_order_relaxed))
111 atomic_store_explicit(&d->bottom, b + 1, memory_order_relaxed);
122 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);
126 atomic_thread_fence(memory_order_seq_cst);
127 b = atomic_load_explicit(&d->bottom, memory_order_acquire);
129 if (t >= b)
return NULL;
130 x = atomic_load_explicit(&d->buf[t & XTC_DEQUE_MASK],
131 memory_order_relaxed);
132 if (!atomic_compare_exchange_strong_explicit(
134 memory_order_seq_cst, memory_order_relaxed))
146 int64_t b = atomic_load_explicit(&d->bottom, memory_order_acquire);
147 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);