|
|
|
@ -30,10 +30,14 @@ |
|
|
|
|
#include <stddef.h> |
|
|
|
|
|
|
|
|
|
#include <atomic> |
|
|
|
|
#include <iosfwd> |
|
|
|
|
#include <limits> |
|
|
|
|
#include <memory> |
|
|
|
|
#include <new> |
|
|
|
|
#include <utility> |
|
|
|
|
|
|
|
|
|
#include "absl/meta/type_traits.h" |
|
|
|
|
#include "absl/utility/utility.h" |
|
|
|
|
|
|
|
|
|
#include <grpc/event_engine/memory_allocator.h> |
|
|
|
|
|
|
|
|
|
#include "src/core/lib/gpr/alloc.h" |
|
|
|
@ -41,14 +45,13 @@ |
|
|
|
|
#include "src/core/lib/promise/context.h" |
|
|
|
|
#include "src/core/lib/resource_quota/memory_quota.h" |
|
|
|
|
|
|
|
|
|
#define GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC |
|
|
|
|
// #define GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
|
|
|
|
|
// #define GRPC_ARENA_TRACE_POOLED_ALLOCATIONS
|
|
|
|
|
|
|
|
|
|
namespace grpc_core { |
|
|
|
|
|
|
|
|
|
namespace arena_detail { |
|
|
|
|
|
|
|
|
|
#ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC |
|
|
|
|
struct PoolAndSize { |
|
|
|
|
size_t alloc_size; |
|
|
|
|
size_t pool_index; |
|
|
|
@ -110,19 +113,16 @@ PoolAndSize ChoosePoolForAllocationSize( |
|
|
|
|
size_t n, absl::integer_sequence<size_t, kBucketSizes...>) { |
|
|
|
|
return ChoosePoolForAllocationSizeImpl<0, kBucketSizes...>::Fn(n); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
} // namespace arena_detail
|
|
|
|
|
|
|
|
|
|
class Arena { |
|
|
|
|
#ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC |
|
|
|
|
// Selected pool sizes.
|
|
|
|
|
// How to tune: see tools/codegen/core/optimize_arena_pool_sizes.py
|
|
|
|
|
using PoolSizes = absl::integer_sequence<size_t, 80, 304, 528, 1024>; |
|
|
|
|
struct FreePoolNode { |
|
|
|
|
FreePoolNode* next; |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
// Create an arena, with \a initial_size bytes in the first allocated buffer.
|
|
|
|
@ -372,11 +372,9 @@ class Arena { |
|
|
|
|
|
|
|
|
|
void* AllocZone(size_t size); |
|
|
|
|
|
|
|
|
|
#ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC |
|
|
|
|
void* AllocPooled(size_t obj_size, size_t alloc_size, |
|
|
|
|
std::atomic<FreePoolNode*>* head); |
|
|
|
|
static void FreePooled(void* p, std::atomic<FreePoolNode*>* head); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
void TracePoolAlloc(size_t size, void* ptr) { |
|
|
|
|
(void)size; |
|
|
|
|