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);
79 atomic_thread_fence(memory_order_release);
80 atomic_store_explicit(&d->bottom, b + 1, memory_order_relaxed);
94 int64_t b = atomic_load_explicit(&d->bottom, memory_order_relaxed) - 1;
98 atomic_store_explicit(&d->bottom, b, memory_order_relaxed);
99 atomic_thread_fence(memory_order_seq_cst);
100 t = atomic_load_explicit(&d->top, memory_order_relaxed);
104 atomic_store_explicit(&d->bottom, t, memory_order_relaxed);
108 x = atomic_load_explicit(&d->buf[b & XTC_DEQUE_MASK],
109 memory_order_relaxed);
113 if (!atomic_compare_exchange_strong_explicit(
115 memory_order_seq_cst, memory_order_relaxed))
117 atomic_store_explicit(&d->bottom, b + 1, memory_order_relaxed);
128 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);
132 atomic_thread_fence(memory_order_seq_cst);
133 b = atomic_load_explicit(&d->bottom, memory_order_acquire);
135 if (t >= b)
return NULL;
136 x = atomic_load_explicit(&d->buf[t & XTC_DEQUE_MASK],
137 memory_order_relaxed);
138 if (!atomic_compare_exchange_strong_explicit(
140 memory_order_seq_cst, memory_order_relaxed))
152 int64_t b = atomic_load_explicit(&d->bottom, memory_order_acquire);
153 int64_t t = atomic_load_explicit(&d->top, memory_order_acquire);