Skip to content

Commit ca9c46c

Browse files
Zainullin DamirZainullin Damir
authored andcommitted
++
1 parent b22e10b commit ca9c46c

1 file changed

Lines changed: 16 additions & 10 deletions

File tree

include/ipfixprobe/outputPlugin/outputStorage/allocationBufferS.hpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)