@@ -24,13 +24,11 @@ class AllocationBufferS : public AllocationBufferBase<ElementType> {
2424 static_assert (
2525 std::atomic<HelpState>::is_always_lock_free,
2626 " HelpState must be lock-free atomic" );
27- // m_writersData.resize(writersCount);
2827
2928 ElementType* begin = m_objectPool.data ();
3029 const std::size_t objectsPerWriter = m_objectPool.size () / writersCount;
3130 for (const auto _ : std::views::iota (0U , writersCount)) {
3231 m_writersData.emplace_back (begin, objectsPerWriter);
33- // writerData.storage = std::span<ElementType>(begin, objectsPerWriter);
3432 begin += objectsPerWriter;
3533 }
3634 }
@@ -91,9 +89,24 @@ class AllocationBufferS : public AllocationBufferBase<ElementType> {
9189 while (m_helpStates[writerIndex]->load (std::memory_order_acquire).stealingRequested ) {
9290 BackoffScheme (1 , 0 ).backoff ();
9391 }
94- m_helpStates[writerIndex]->store (HelpState {false , false }, std::memory_order_release);
92+
93+ do {
94+ expected = m_helpStates[writerIndex]->load (std::memory_order_acquire);
95+ desired = expected;
96+ desired.stealingAllowed = false ;
97+ } while (!m_helpStates[writerIndex]->compare_exchange_weak (
98+ expected,
99+ desired,
100+ std::memory_order_release,
101+ std::memory_order_acquire));
102+
103+ while (m_helpStates[writerIndex]->load (std::memory_order_acquire).stealingRequested ) {
104+ BackoffScheme (1 , 0 ).backoff ();
105+ }
95106 }
96107
108+ // m_helpStates[writerIndex]->store(HelpState {false, false}, std::memory_order_release);
109+
97110 void steal (const uint8_t writerIndex) noexcept
98111 {
99112 WriterData& writerData = m_writersData[writerIndex].get ();
@@ -168,13 +181,9 @@ class AllocationBufferS : public AllocationBufferBase<ElementType> {
168181 std::memory_order_release,
169182 std::memory_order_acquire));
170183 }
171- /* = m_helpStates[victimIndex]->load(std::memory_order_acquire);
172- currentValue.stealingRequested = false;
173- m_helpStates[victimIndex]->store(currentValue, std::memory_order_release);*/
174184
175185 struct WriterData {
176186 explicit WriterData (ElementType* begin, const std::size_t size) noexcept
177- // : currentUserIndex(writerIndex)
178187 {
179188 storage.reserve (size);
180189 for (const auto _ : std::views::iota (0U , size)) {
@@ -183,11 +192,9 @@ class AllocationBufferS : public AllocationBufferBase<ElementType> {
183192 }
184193
185194 std::vector<ElementType*> storage;
186- // std::atomic<uint8_t> currentUserIndex {0};
187195 };
188196
189197 struct HelpState {
190- // uint16_t helpRequests {0};
191198 bool stealingRequested {false };
192199 bool stealingAllowed {false };
193200 };
@@ -196,7 +203,6 @@ class AllocationBufferS : public AllocationBufferBase<ElementType> {
196203 std::vector<CacheAlligned<WriterData>> m_writersData;
197204 std::array<CacheAlligned<std::atomic<HelpState>>, 32 > m_helpStates;
198205 std::atomic<std::size_t > d_stolen {0 };
199- // FastRandomGenerator m_randomGenerator;
200206};
201207
202208} // namespace ipxp::output
0 commit comments