in dispenso/detail/small_buffer_allocator_impl.h [158:190]
static size_t grabFromCentralStore(char** buffers) {
auto& queue = getThreadQueuingData();
auto& globals = getSmallBufferGlobals<kChunkSize>();
auto& lock = globals.backingStoreLock;
auto& backingStore = globals.backingStore;
while (true) {
size_t grabbed = queue.try_dequeue_bulk(buffers, kIdealNumTLBuffers);
if (grabbed) {
return grabbed;
}
uint32_t allocId = lock.fetch_add(1, std::memory_order_acquire);
if (allocId == 0) {
char* buffer = reinterpret_cast<char*>(detail::alignedMalloc(kMallocBytes, kChunkSize));
backingStore.push_back(buffer);
constexpr size_t kNumToPush = kBuffersPerMalloc - kIdealNumTLBuffers;
char* topush[kNumToPush];
for (size_t i = 0; i < kNumToPush; ++i, buffer += kChunkSize) {
topush[i] = buffer;
}
queue.enqueue_bulk(topush, kNumToPush);
lock.store(0, std::memory_order_release);
for (size_t i = 0; i < kIdealNumTLBuffers; ++i, buffer += kChunkSize) {
buffers[i] = buffer;
}
return kIdealNumTLBuffers;
} else {
while (lock.load(std::memory_order_relaxed)) {
std::this_thread::yield();
}
}
}
}