| 140 | } |
| 141 | |
| 142 | Status BufferPool::CreatePage( |
| 143 | ClientHandle* client, int64_t len, PageHandle* handle, const BufferHandle** buffer) { |
| 144 | DCHECK(!handle->is_open()); |
| 145 | DCHECK_GE(len, min_buffer_len_); |
| 146 | DCHECK_EQ(len, BitUtil::RoundUpToPowerOfTwo(len)); |
| 147 | |
| 148 | BufferHandle new_buffer; |
| 149 | // No changes have been made to state yet, so we can cleanly return on error. |
| 150 | RETURN_IF_ERROR(AllocateBuffer(client, len, &new_buffer)); |
| 151 | Page* page = client->impl_->CreatePinnedPage(move(new_buffer)); |
| 152 | handle->Open(page, client); |
| 153 | if (buffer != nullptr) *buffer = &page->buffer; |
| 154 | return Status::OK(); |
| 155 | } |
| 156 | |
| 157 | void BufferPool::DestroyPage(ClientHandle* client, PageHandle* handle) { |
| 158 | if (!handle->is_open()) return; // DestroyPage() should be idempotent. |