|
|
|
@ -39,7 +39,6 @@ |
|
|
|
|
|
|
|
|
|
#include "test/core/util/memory_counters.h" |
|
|
|
|
|
|
|
|
|
static gpr_mu g_memory_mutex; |
|
|
|
|
static struct grpc_memory_counters g_memory_counters; |
|
|
|
|
static gpr_allocation_functions g_old_allocs; |
|
|
|
|
|
|
|
|
@ -50,12 +49,14 @@ static void guard_free(void *vptr); |
|
|
|
|
static void *guard_malloc(size_t size) { |
|
|
|
|
size_t *ptr; |
|
|
|
|
if (!size) return NULL; |
|
|
|
|
gpr_mu_lock(&g_memory_mutex); |
|
|
|
|
g_memory_counters.total_size_absolute += size; |
|
|
|
|
g_memory_counters.total_size_relative += size; |
|
|
|
|
g_memory_counters.total_allocs_absolute++; |
|
|
|
|
g_memory_counters.total_allocs_relative++; |
|
|
|
|
gpr_mu_unlock(&g_memory_mutex); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_size_absolute, |
|
|
|
|
(gpr_atm)size); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_size_relative, |
|
|
|
|
(gpr_atm)size); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_allocs_absolute, |
|
|
|
|
(gpr_atm)1); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_allocs_relative, |
|
|
|
|
(gpr_atm)1); |
|
|
|
|
ptr = g_old_allocs.malloc_fn(size + sizeof(size)); |
|
|
|
|
*ptr++ = size; |
|
|
|
|
return ptr; |
|
|
|
@ -71,12 +72,14 @@ static void *guard_realloc(void *vptr, size_t size) { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
--ptr; |
|
|
|
|
gpr_mu_lock(&g_memory_mutex); |
|
|
|
|
g_memory_counters.total_size_absolute += size; |
|
|
|
|
g_memory_counters.total_size_relative -= *ptr; |
|
|
|
|
g_memory_counters.total_size_relative += size; |
|
|
|
|
g_memory_counters.total_allocs_absolute++; |
|
|
|
|
gpr_mu_unlock(&g_memory_mutex); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_size_absolute, |
|
|
|
|
(gpr_atm)size); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_size_relative, |
|
|
|
|
-(gpr_atm)*ptr); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_size_relative, |
|
|
|
|
(gpr_atm)size); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_allocs_absolute, |
|
|
|
|
(gpr_atm)1); |
|
|
|
|
ptr = g_old_allocs.realloc_fn(ptr, size + sizeof(size)); |
|
|
|
|
*ptr++ = size; |
|
|
|
|
return ptr; |
|
|
|
@ -86,10 +89,10 @@ static void guard_free(void *vptr) { |
|
|
|
|
size_t *ptr = vptr; |
|
|
|
|
if (!vptr) return; |
|
|
|
|
--ptr; |
|
|
|
|
gpr_mu_lock(&g_memory_mutex); |
|
|
|
|
g_memory_counters.total_size_relative -= *ptr; |
|
|
|
|
g_memory_counters.total_allocs_relative--; |
|
|
|
|
gpr_mu_unlock(&g_memory_mutex); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_size_relative, |
|
|
|
|
-(gpr_atm)*ptr); |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&g_memory_counters.total_allocs_relative, |
|
|
|
|
-(gpr_atm)1); |
|
|
|
|
g_old_allocs.free_fn(ptr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -98,20 +101,23 @@ struct gpr_allocation_functions g_guard_allocs = {guard_malloc, guard_realloc, |
|
|
|
|
|
|
|
|
|
void grpc_memory_counters_init() { |
|
|
|
|
memset(&g_memory_counters, 0, sizeof(g_memory_counters)); |
|
|
|
|
gpr_mu_init(&g_memory_mutex); |
|
|
|
|
g_old_allocs = gpr_get_allocation_functions(); |
|
|
|
|
gpr_set_allocation_functions(g_guard_allocs); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void grpc_memory_counters_destroy() { |
|
|
|
|
gpr_set_allocation_functions(g_old_allocs); |
|
|
|
|
gpr_mu_destroy(&g_memory_mutex); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct grpc_memory_counters grpc_memory_counters_snapshot() { |
|
|
|
|
struct grpc_memory_counters counters; |
|
|
|
|
gpr_mu_lock(&g_memory_mutex); |
|
|
|
|
counters = g_memory_counters; |
|
|
|
|
gpr_mu_unlock(&g_memory_mutex); |
|
|
|
|
counters.total_size_relative = |
|
|
|
|
gpr_atm_no_barrier_load(&g_memory_counters.total_size_relative); |
|
|
|
|
counters.total_size_absolute = |
|
|
|
|
gpr_atm_no_barrier_load(&g_memory_counters.total_size_absolute); |
|
|
|
|
counters.total_allocs_relative = |
|
|
|
|
gpr_atm_no_barrier_load(&g_memory_counters.total_allocs_relative); |
|
|
|
|
counters.total_allocs_absolute = |
|
|
|
|
gpr_atm_no_barrier_load(&g_memory_counters.total_allocs_absolute); |
|
|
|
|
return counters; |
|
|
|
|
} |
|
|
|
|