|
|
|
@ -84,22 +84,18 @@ public:
|
|
|
|
|
{
|
|
|
|
|
cell_t* cell;
|
|
|
|
|
size_t pos = enqueue_pos_.load(std::memory_order_relaxed);
|
|
|
|
|
for (;;)
|
|
|
|
|
{
|
|
|
|
|
for (;;) {
|
|
|
|
|
cell = &buffer_[pos & buffer_mask_];
|
|
|
|
|
size_t seq = cell->sequence_.load(std::memory_order_acquire);
|
|
|
|
|
intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos);
|
|
|
|
|
if (dif == 0)
|
|
|
|
|
{
|
|
|
|
|
if (dif == 0) {
|
|
|
|
|
if (enqueue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed))
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else if (dif < 0)
|
|
|
|
|
{
|
|
|
|
|
else if (dif < 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
else {
|
|
|
|
|
pos = enqueue_pos_.load(std::memory_order_relaxed);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -112,14 +108,12 @@ public:
|
|
|
|
|
{
|
|
|
|
|
cell_t* cell;
|
|
|
|
|
size_t pos = dequeue_pos_.load(std::memory_order_relaxed);
|
|
|
|
|
for (;;)
|
|
|
|
|
{
|
|
|
|
|
for (;;) {
|
|
|
|
|
cell = &buffer_[pos & buffer_mask_];
|
|
|
|
|
size_t seq =
|
|
|
|
|
cell->sequence_.load(std::memory_order_acquire);
|
|
|
|
|
intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos + 1);
|
|
|
|
|
if (dif == 0)
|
|
|
|
|
{
|
|
|
|
|
if (dif == 0) {
|
|
|
|
|
if (dequeue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed))
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -133,14 +127,16 @@ public:
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t approx_size()
|
|
|
|
|
bool is_empty()
|
|
|
|
|
{
|
|
|
|
|
size_t first_pos = dequeue_pos_.load(std::memory_order_relaxed);
|
|
|
|
|
size_t last_pos = enqueue_pos_.load(std::memory_order_relaxed);
|
|
|
|
|
if (last_pos <= first_pos)
|
|
|
|
|
return 0;
|
|
|
|
|
auto size = last_pos - first_pos;
|
|
|
|
|
return size < max_size_ ? size : max_size_;
|
|
|
|
|
unsigned front, front1, back;
|
|
|
|
|
// try to take a consistent snapshot of front/tail.
|
|
|
|
|
do {
|
|
|
|
|
front = enqueue_pos_.load(std::memory_order_acquire);
|
|
|
|
|
back = dequeue_pos_.load(std::memory_order_acquire);
|
|
|
|
|
front1 = enqueue_pos_.load(std::memory_order_relaxed);
|
|
|
|
|
} while (front != front1);
|
|
|
|
|
return back == front;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|