blob: 51a73579124e10daf90703514213bff5122ce536 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "buffer_pool.h"
void BufferPool::AddBuffer(const CodecBuffer* buffer) {
ZX_DEBUG_ASSERT(buffer);
free_buffers_.Push(buffer);
}
const CodecBuffer* BufferPool::AllocateBuffer(size_t alloc_len) {
auto maybe_buffer = free_buffers_.WaitForElement();
if (!maybe_buffer) {
return nullptr;
}
auto& buffer = *maybe_buffer;
{
std::lock_guard<std::mutex> lock(lock_);
buffers_in_use_[buffer->base()] = {
.buffer = buffer,
.bytes_used = alloc_len,
};
}
return buffer;
}
void BufferPool::FreeBuffer(uint8_t* base) {
const CodecBuffer* buffer;
{
std::lock_guard<std::mutex> lock(lock_);
{
auto nh = buffers_in_use_.extract(base);
ZX_DEBUG_ASSERT(!nh.empty());
buffer = nh.mapped().buffer;
}
}
free_buffers_.Push(buffer);
}
std::optional<BufferPool::Allocation> BufferPool::FindBufferByBase(uint8_t* base) {
std::lock_guard lock(lock_);
auto iter = buffers_in_use_.find(base);
if (iter == buffers_in_use_.end()) {
return std::nullopt;
}
return iter->second;
}
void BufferPool::Reset(bool keep_data) {
if (!keep_data) {
std::lock_guard<std::mutex> lock(lock_);
ZX_DEBUG_ASSERT(buffers_in_use_.empty());
}
free_buffers_.Reset(keep_data);
}
void BufferPool::StopAllWaits() { free_buffers_.StopAllWaits(); }
bool BufferPool::has_buffers_in_use() {
std::lock_guard<std::mutex> lock(lock_);
return !buffers_in_use_.empty();
}