|
|
|
@ -78,13 +78,14 @@ void *gpr_arena_alloc(gpr_arena *arena, size_t size) { |
|
|
|
|
while (start > z->size_end) { |
|
|
|
|
zone *next_z = (zone *)gpr_atm_acq_load(&z->next_atm); |
|
|
|
|
if (next_z == NULL) { |
|
|
|
|
size_t next_z_size = GPR_MAX((size_t)gpr_atm_no_barrier_load(&arena->size_so_far), size); |
|
|
|
|
size_t next_z_size = |
|
|
|
|
GPR_MAX((size_t)gpr_atm_no_barrier_load(&arena->size_so_far), size); |
|
|
|
|
next_z = gpr_zalloc(sizeof(zone) + next_z_size); |
|
|
|
|
next_z->size_begin = z->size_end; |
|
|
|
|
next_z->size_end = z->size_end + next_z_size; |
|
|
|
|
if (!gpr_atm_rel_cas(&z->next_atm, (gpr_atm)NULL, (gpr_atm)next_z)) { |
|
|
|
|
gpr_free(next_z); |
|
|
|
|
next_z = (zone*)gpr_atm_acq_load(&z->next_atm);
|
|
|
|
|
next_z = (zone *)gpr_atm_acq_load(&z->next_atm); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
z = next_z; |
|
|
|
|