diff --git a/src/core/lib/gpr/arena.cc b/src/core/lib/gpr/arena.cc index 4e7094d9bb2..77f9357146d 100644 --- a/src/core/lib/gpr/arena.cc +++ b/src/core/lib/gpr/arena.cc @@ -81,8 +81,9 @@ typedef struct zone { } zone; struct gpr_arena { + // Keep track of the total used size. We use this in our call sizing + // historesis. gpr_atm total_used; - gpr_atm initial_zone_used; size_t initial_zone_size; zone initial_zone; zone* last_zone; @@ -120,16 +121,10 @@ size_t gpr_arena_destroy(gpr_arena* arena) { void* gpr_arena_alloc(gpr_arena* arena, size_t size) { size = GPR_ROUND_UP_TO_ALIGNMENT_SIZE(size); - // Update the total used size to estimate next call's size. - gpr_atm_no_barrier_fetch_add(&arena->total_used, size); - // Try to allocate in the initial zone. - size_t initial_zone_alloc_begin = static_cast( - gpr_atm_no_barrier_fetch_add(&arena->initial_zone_used, size)); - size_t initial_zone_alloc_end = initial_zone_alloc_begin + size; - if (initial_zone_alloc_end <= arena->initial_zone_size) { + size_t begin = gpr_atm_no_barrier_fetch_add(&arena->total_used, size); + if (begin + size <= arena->initial_zone_size) { return reinterpret_cast(arena) + - GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(gpr_arena)) + - initial_zone_alloc_begin; + GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(gpr_arena)) + begin; } else { // If the allocation isn't able to end in the initial zone, create a new // zone for this allocation, and any unused space in the initial zone is