46 size_t head_sequence = _head.load(std::memory_order_relaxed);
50 Node* node = &_buffer[head_sequence & _mask];
51 size_t node_sequence = node->sequence.load(std::memory_order_acquire);
54 int64_t diff = (int64_t)node_sequence - (int64_t)head_sequence;
61 if (_head.compare_exchange_weak(head_sequence, head_sequence + 1, std::memory_order_relaxed))
64 node->value = std::move(item);
67 node->sequence.store(head_sequence + 1, std::memory_order_release);
80 head_sequence = _head.load(std::memory_order_relaxed);
91 size_t tail_sequence = _tail.load(std::memory_order_relaxed);
95 Node* node = &_buffer[tail_sequence & _mask];
96 size_t node_sequence = node->sequence.load(std::memory_order_acquire);
99 int64_t diff = (int64_t)node_sequence - (int64_t)(tail_sequence + 1);
106 if (_tail.compare_exchange_weak(tail_sequence, tail_sequence + 1, std::memory_order_relaxed))
109 item = std::move(node->value);
112 node->sequence.store(tail_sequence + _mask + 1, std::memory_order_release);
124 tail_sequence = _tail.load(std::memory_order_relaxed);