Skip to content

Commit 2a36d1f

Browse files
Improve sc-sp behavior performance.
1 parent 9ecc8a5 commit 2a36d1f

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

WaitFreeRingBufferUtilities/Include/ring-buffer-base.inl

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,6 @@ struct Element : ElementFeatures...
9595
}
9696
};
9797

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-
10798
template <typename Element, std::size_t Count>
10899
struct RingBufferStateBase
109100
{
@@ -223,25 +214,30 @@ template <typename BaseType>
223214
struct SingleProducerBehaviour : BaseType
224215
{
225216
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{};
227224

228225
public:
229226
using ElementType = typename BaseType::ElementType;
230227

231228
template <typename... Args>
232229
bool push(Args &&... args)
233230
{
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)
237232
return false;
238-
}
233+
234+
state.pushed_task_count++;
239235

240236
while (true)
241237
{
242-
const std::size_t element_index = (end.value++) & BaseType::COUNT_MASK;
238+
const std::size_t element_index = (state.end++) & BaseType::COUNT_MASK;
243239

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))
245241
{
246242
BaseType::elements[element_index].value_ptr.store(new (&BaseType::elements[element_index].storage) ElementType(std::forward<Args>(args)...),
247243
std::memory_order_release);
@@ -257,24 +253,29 @@ template <typename BaseType>
257253
struct SingleConsumerBehaviour : BaseType
258254
{
259255
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{};
261263

262264
public:
263265
using ElementType = typename BaseType::ElementType;
264266

265267
OptionalType<ElementType> pop()
266268
{
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)
270270
return OptionalType<ElementType>{};
271-
}
271+
272+
state.popped_task_count++;
272273

273274
while (true)
274275
{
275-
const std::size_t element_index = (begin.value++) & BaseType::COUNT_MASK;
276+
const std::size_t element_index = (state.begin++) & BaseType::COUNT_MASK;
276277

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);
278279
if (value_ptr)
279280
{
280281
OptionalType<ElementType> result{std::move(*value_ptr)};

0 commit comments

Comments
 (0)