blob: f00ad1a153aa2d5350f745c3d2538984a85a149c [file] [log] [blame]
// Copyright 2017 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 "slab_allocator.h"
#include <memory>
#include "byte_buffer.h"
#include "slab_buffer.h"
namespace bt {
static_assert(kLargeBufferSize > kSmallBufferSize);
using SmallBufferTraits = SlabBufferTraits<kSmallBufferSize, kSlabSize / kSmallBufferSize>;
using LargeBufferTraits = SlabBufferTraits<kLargeBufferSize, kSlabSize / kLargeBufferSize>;
using SmallAllocator = fbl::SlabAllocator<SmallBufferTraits>;
using LargeAllocator = fbl::SlabAllocator<LargeBufferTraits>;
MutableByteBufferPtr NewSlabBuffer(size_t size) {
if (size == 0) {
// Don't return nullptr because that would indicate an error.
return std::make_unique<DynamicByteBuffer>();
}
if (size <= kSmallBufferSize) {
auto buffer = SmallAllocator::New(size);
if (buffer) {
return buffer;
}
}
if (size > kLargeBufferSize) {
// Fall back to using the system allocator to avoid panicking when allocating very large
// buffers. This can still return nullptr if allocating the DynamicByteBuffer fails.
// NOTE: DynamicByteBuffer construction panics if allocating the underlying buffer fails.
return std::make_unique<DynamicByteBuffer>(size);
}
return LargeAllocator::New(size);
}
} // namespace bt
DECLARE_STATIC_SLAB_ALLOCATOR_STORAGE(bt::LargeBufferTraits, bt::kMaxNumSlabs, true);
DECLARE_STATIC_SLAB_ALLOCATOR_STORAGE(bt::SmallBufferTraits, bt::kMaxNumSlabs, true);