@@ -95,15 +95,6 @@ struct Element : ElementFeatures...
95
95
}
96
96
};
97
97
98
- struct SizeTWrapper
99
- {
100
- std::size_t value;
101
-
102
- SizeTWrapper (const std::size_t i_value) : value(i_value)
103
- {
104
- }
105
- };
106
-
107
98
template <typename Element, std::size_t Count>
108
99
struct RingBufferStateBase
109
100
{
@@ -223,25 +214,30 @@ template <typename BaseType>
223
214
struct SingleProducerBehaviour : BaseType
224
215
{
225
216
private:
226
- Details::CacheAlignedAndPaddedObject<SizeTWrapper> end{std::size_t (0 )};
217
+ struct State
218
+ {
219
+ std::int64_t pushed_task_count{0 };
220
+ std::size_t end{0 };
221
+ };
222
+
223
+ Details::CacheAlignedAndPaddedObject<State> state{};
227
224
228
225
public:
229
226
using ElementType = typename BaseType::ElementType;
230
227
231
228
template <typename ... Args>
232
229
bool push (Args &&... args)
233
230
{
234
- if (BaseType::push_task_count.fetch_sub (1 , std::memory_order_acquire) <= std::int64_t (0 ))
235
- {
236
- BaseType::push_task_count.fetch_add (1 , std::memory_order_relaxed);
231
+ if (BaseType::push_task_count.load (std::memory_order_acquire) == state.pushed_task_count )
237
232
return false ;
238
- }
233
+
234
+ state.pushed_task_count ++;
239
235
240
236
while (true )
241
237
{
242
- const std::size_t element_index = (end. value ++) & BaseType::COUNT_MASK;
238
+ const std::size_t element_index = (state. end ++) & BaseType::COUNT_MASK;
243
239
244
- if (!BaseType::elements[element_index].value_ptr .load (std::memory_order_relaxed ))
240
+ if (!BaseType::elements[element_index].value_ptr .load (std::memory_order_acquire ))
245
241
{
246
242
BaseType::elements[element_index].value_ptr .store (new (&BaseType::elements[element_index].storage ) ElementType (std::forward<Args>(args)...),
247
243
std::memory_order_release);
@@ -257,24 +253,29 @@ template <typename BaseType>
257
253
struct SingleConsumerBehaviour : BaseType
258
254
{
259
255
private:
260
- Details::CacheAlignedAndPaddedObject<SizeTWrapper> begin{std::size_t (0 )};
256
+ struct State
257
+ {
258
+ std::int64_t popped_task_count{0 };
259
+ std::size_t begin{0 };
260
+ };
261
+
262
+ Details::CacheAlignedAndPaddedObject<State> state{};
261
263
262
264
public:
263
265
using ElementType = typename BaseType::ElementType;
264
266
265
267
OptionalType<ElementType> pop ()
266
268
{
267
- if (BaseType::pop_task_count.fetch_sub (1 , std::memory_order_acquire) <= std::int64_t (0 ))
268
- {
269
- BaseType::pop_task_count.fetch_add (1 , std::memory_order_relaxed);
269
+ if (BaseType::pop_task_count.load (std::memory_order_acquire) == state.popped_task_count )
270
270
return OptionalType<ElementType>{};
271
- }
271
+
272
+ state.popped_task_count ++;
272
273
273
274
while (true )
274
275
{
275
- const std::size_t element_index = (begin. value ++) & BaseType::COUNT_MASK;
276
+ const std::size_t element_index = (state. begin ++) & BaseType::COUNT_MASK;
276
277
277
- const auto value_ptr = BaseType::elements[element_index].value_ptr .load (std::memory_order_relaxed );
278
+ const auto value_ptr = BaseType::elements[element_index].value_ptr .load (std::memory_order_acquire );
278
279
if (value_ptr)
279
280
{
280
281
OptionalType<ElementType> result{std::move (*value_ptr)};
0 commit comments