7 atomic_size_t top, bottom;
12 size_t b = load_explicit(&q->bottom, relaxed) - 1;
13 Array *a = load_explicit(&q->array, relaxed);
14 store_explicit(&q->bottom, b, relaxed);
15 thread_fence(seq_cst);
16 size_t t = load_explicit(&q->top, relaxed);
19 /* Non-empty queue. */
20 x = load_explicit(&a->buffer[b % a->size], relaxed);
22 /* Single last element in queue. */
23 if (!compare_exchange_strong_explicit(&q->top, &t, t + 1, seq_cst, relaxed))
26 store_explicit(&q->bottom, b + 1, relaxed);
28 } else { /* Empty queue. */
30 store_explicit(&q->bottom, b + 1, relaxed);
35 void push(Deque *q, int x) {
36 size_t b = load_explicit(&q->bottom, relaxed);
37 size_t t = load_explicit(&q->top, acquire);
38 Array *a = load_explicit(&q->array, relaxed);
39 if (b - t > a->size - 1) /* Full queue. */
41 store_explicit(&a->buffer[b % a->size], x, relaxed);
42 thread_fence(release);
43 store_explicit(&q->bottom, b + 1, relaxed);
47 size_t t = load_explicit(&q->top, acquire);
48 thread_fence(seq_cst);
49 size_t b = load_explicit(&q->bottom, acquire);
52 /* Non-empty queue. */
53 Array *a = load_explicit(&q->array, relaxed);
54 x = load_explicit(&a->buffer[t % a->size], relaxed);
55 if (!compare_exchange_strong_explicit(&q->top, &t, t + 1, seq_cst, relaxed))