in dispenso/concurrent_object_arena.h [157:181]
Index grow_by(const Index delta) {
Index newPos;
Index oldPos = pos_.load(std::memory_order_relaxed);
do {
Index curSize = allocatedSize_.load(std::memory_order_acquire);
if (oldPos + delta >= curSize) {
const std::lock_guard<std::mutex> guard(resizeMutex_);
curSize = allocatedSize_.load(std::memory_order_relaxed);
while (oldPos + delta >= curSize) {
allocateBuffer();
allocatedSize_.store(curSize + kBufferSize, std::memory_order_release);
curSize = curSize + kBufferSize;
}
}
newPos = oldPos + delta;
} while (!std::atomic_compare_exchange_weak_explicit(
&pos_, &oldPos, newPos, std::memory_order_release, std::memory_order_relaxed));
constructObjects(oldPos, oldPos + delta);
return oldPos;
}