Commit 5e078979 authored by Xavier Thompson's avatar Xavier Thompson

Invert top and bottom back in deque.hpp

parent 5369a945
...@@ -144,57 +144,57 @@ namespace typon ...@@ -144,57 +144,57 @@ namespace typon
void push(T x) noexcept void push(T x) noexcept
{ {
u64 t = _top.load(relaxed); u64 bottom = _bottom.load(relaxed);
u64 b = _bottom.load(acquire); u64 top = _top.load(acquire);
Array * array = _array.load(relaxed); Array * array = _array.load(relaxed);
if (t - b > array->capacity() - 1) if (bottom - top > array->capacity() - 1)
{ {
array = array->grow(b, t); array = array->grow(top, bottom);
_array.store(array); _array.store(array);
} }
array->put(t, x); array->put(bottom, x);
std::atomic_thread_fence(release); std::atomic_thread_fence(release);
_top.store(t + 1, relaxed); _bottom.store(bottom + 1, relaxed);
} }
Optional<T> pop() noexcept Optional<T> pop() noexcept
{ {
u64 t = _top.load(relaxed) - 1; u64 bottom = _bottom.load(relaxed) - 1;
Array * array = _array.load(relaxed); Array * array = _array.load(relaxed);
_top.store(t, relaxed); _bottom.store(bottom, relaxed);
std::atomic_thread_fence(seq_cst); std::atomic_thread_fence(seq_cst);
u64 b = _bottom.load(relaxed); u64 top = _top.load(relaxed);
Optional<T> x {}; Optional<T> x {};
if (b <= t) if (top <= bottom)
{ {
x = array->get(t); x = array->get(bottom);
if (b == t) if (top == bottom)
{ {
if (!_bottom.compare_exchange_strong(b, b + 1, seq_cst, relaxed)) if (!_top.compare_exchange_strong(top, top + 1, seq_cst, relaxed))
{ {
x = {}; x = {};
} }
_top.store(t + 1, relaxed); _bottom.store(bottom + 1, relaxed);
} }
} }
else else
{ {
_top.store(t + 1, relaxed); _bottom.store(bottom + 1, relaxed);
} }
return x; return x;
} }
Optional<T> steal() noexcept Optional<T> steal() noexcept
{ {
u64 b = _bottom.load(acquire); u64 top = _top.load(acquire);
std::atomic_thread_fence(seq_cst); std::atomic_thread_fence(seq_cst);
u64 t = _top.load(acquire); u64 bottom = _bottom.load(acquire);
Optional<T> x {}; Optional<T> x {};
if (b < t) if (top < bottom)
{ {
Array * array = _array.load(consume); Array * array = _array.load(consume);
x = array->get(b); x = array->get(top);
if (!_bottom.compare_exchange_strong(b, b + 1, seq_cst, relaxed)) if (!_top.compare_exchange_strong(top, top + 1, seq_cst, relaxed))
{ {
return {Optional<T>::abort}; return {Optional<T>::abort};
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment