| 144 | } |
| 145 | |
| 146 | Result AsyncBuffersPool::requestNewBuffer(size_t minimumSizeInBytes, AsyncBufferView::ID& bufferID, Span<char>& data) |
| 147 | { |
| 148 | for (AsyncBufferView& buffer : buffers) |
| 149 | { |
| 150 | if (buffer.type == AsyncBufferView::Type::Empty) |
| 151 | continue; |
| 152 | if (buffer.refs == 0) |
| 153 | { |
| 154 | if (buffer.type == AsyncBufferView::Type::Growable) |
| 155 | { |
| 156 | AsyncBufferView::GrowableStorage storage; |
| 157 | |
| 158 | auto da = buffer.getGrowableBuffer(storage, true)->getDirectAccess(); |
| 159 | buffer.writableData = {static_cast<char*>(da.data), da.sizeInBytes}; |
| 160 | (void)buffer.getGrowableBuffer(storage, false); // destruct |
| 161 | } |
| 162 | if (buffer.writableData.sizeInBytes() >= minimumSizeInBytes) |
| 163 | { |
| 164 | buffer.refs = 1; |
| 165 | buffer.offset = 0; |
| 166 | buffer.length = buffer.writableData.sizeInBytes(); |
| 167 | |
| 168 | bufferID = |
| 169 | AsyncBufferView::ID(static_cast<AsyncBufferView::ID::NumericType>(&buffer - buffers.begin())); |
| 170 | return getWritableData(bufferID, data); |
| 171 | } |
| 172 | } |
| 173 | } |
| 174 | return Result::Error("AsyncBuffersPool::requestNewBuffer failed"); |
| 175 | } |
| 176 | |
| 177 | void AsyncBuffersPool::setNewBufferSize(AsyncBufferView::ID bufferID, size_t newSizeInBytes) |
| 178 | { |