|
|
|
@ -47,7 +47,8 @@ |
|
|
|
|
* used to determine which kind of element a pointer refers to. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
grpc_tracer_flag grpc_trace_metadata = GRPC_TRACER_INITIALIZER(false); |
|
|
|
|
#define DEBUG_ARGS , const char *file, int line |
|
|
|
|
#define FWD_DEBUG_ARGS , file, line |
|
|
|
|
#define REF_MD_LOCKED(shard, s) ref_md_locked((shard), (s), __FILE__, __LINE__) |
|
|
|
@ -144,15 +145,17 @@ static int is_mdelem_static(grpc_mdelem e) { |
|
|
|
|
|
|
|
|
|
static void ref_md_locked(mdtab_shard *shard, |
|
|
|
|
interned_metadata *md DEBUG_ARGS) { |
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) + 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (GRPC_TRACER_ON(grpc_trace_metadata)) { |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) + 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
if (0 == gpr_atm_no_barrier_fetch_add(&md->refcnt, 1)) { |
|
|
|
|
gpr_atm_no_barrier_fetch_add(&shard->free_estimate, -1); |
|
|
|
@ -243,13 +246,15 @@ grpc_mdelem grpc_mdelem_create( |
|
|
|
|
allocated->key = grpc_slice_ref_internal(key); |
|
|
|
|
allocated->value = grpc_slice_ref_internal(value); |
|
|
|
|
gpr_atm_rel_store(&allocated->refcnt, 1); |
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
char *key_str = grpc_slice_to_c_string(allocated->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(allocated->value); |
|
|
|
|
gpr_log(GPR_DEBUG, "ELM ALLOC:%p:%zu: '%s' = '%s'", (void *)allocated, |
|
|
|
|
gpr_atm_no_barrier_load(&allocated->refcnt), key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (GRPC_TRACER_ON(grpc_trace_metadata)) { |
|
|
|
|
char *key_str = grpc_slice_to_c_string(allocated->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(allocated->value); |
|
|
|
|
gpr_log(GPR_DEBUG, "ELM ALLOC:%p:%zu: '%s' = '%s'", (void *)allocated, |
|
|
|
|
gpr_atm_no_barrier_load(&allocated->refcnt), key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
return GRPC_MAKE_MDELEM(allocated, GRPC_MDELEM_STORAGE_ALLOCATED); |
|
|
|
|
} |
|
|
|
@ -294,13 +299,15 @@ grpc_mdelem grpc_mdelem_create( |
|
|
|
|
md->bucket_next = shard->elems[idx]; |
|
|
|
|
shard->elems[idx] = md; |
|
|
|
|
gpr_mu_init(&md->mu_user_data); |
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(GPR_DEBUG, "ELM NEW:%p:%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (GRPC_TRACER_ON(grpc_trace_metadata)) { |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(GPR_DEBUG, "ELM NEW:%p:%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
shard->count++; |
|
|
|
|
|
|
|
|
@ -356,15 +363,17 @@ grpc_mdelem grpc_mdelem_ref(grpc_mdelem gmd DEBUG_ARGS) { |
|
|
|
|
break; |
|
|
|
|
case GRPC_MDELEM_STORAGE_INTERNED: { |
|
|
|
|
interned_metadata *md = (interned_metadata *)GRPC_MDELEM_DATA(gmd); |
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) + 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (GRPC_TRACER_ON(grpc_trace_metadata)) { |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) + 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
/* we can assume the ref count is >= 1 as the application is calling
|
|
|
|
|
this function - meaning that no adjustment to mdtab_free is necessary, |
|
|
|
@ -376,15 +385,17 @@ grpc_mdelem grpc_mdelem_ref(grpc_mdelem gmd DEBUG_ARGS) { |
|
|
|
|
} |
|
|
|
|
case GRPC_MDELEM_STORAGE_ALLOCATED: { |
|
|
|
|
allocated_metadata *md = (allocated_metadata *)GRPC_MDELEM_DATA(gmd); |
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) + 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (GRPC_TRACER_ON(grpc_trace_metadata)) { |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) + 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
/* we can assume the ref count is >= 1 as the application is calling
|
|
|
|
|
this function - meaning that no adjustment to mdtab_free is necessary, |
|
|
|
@ -404,15 +415,17 @@ void grpc_mdelem_unref(grpc_exec_ctx *exec_ctx, grpc_mdelem gmd DEBUG_ARGS) { |
|
|
|
|
break; |
|
|
|
|
case GRPC_MDELEM_STORAGE_INTERNED: { |
|
|
|
|
interned_metadata *md = (interned_metadata *)GRPC_MDELEM_DATA(gmd); |
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM UNREF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) - 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (GRPC_TRACER_ON(grpc_trace_metadata)) { |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM UNREF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) - 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
uint32_t hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash(md->key), |
|
|
|
|
grpc_slice_hash(md->value)); |
|
|
|
@ -428,15 +441,17 @@ void grpc_mdelem_unref(grpc_exec_ctx *exec_ctx, grpc_mdelem gmd DEBUG_ARGS) { |
|
|
|
|
} |
|
|
|
|
case GRPC_MDELEM_STORAGE_ALLOCATED: { |
|
|
|
|
allocated_metadata *md = (allocated_metadata *)GRPC_MDELEM_DATA(gmd); |
|
|
|
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM UNREF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) - 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (GRPC_TRACER_ON(grpc_trace_metadata)) { |
|
|
|
|
char *key_str = grpc_slice_to_c_string(md->key); |
|
|
|
|
char *value_str = grpc_slice_to_c_string(md->value); |
|
|
|
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, |
|
|
|
|
"ELM UNREF:%p:%zu->%zu: '%s' = '%s'", (void *)md, |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt), |
|
|
|
|
gpr_atm_no_barrier_load(&md->refcnt) - 1, key_str, value_str); |
|
|
|
|
gpr_free(key_str); |
|
|
|
|
gpr_free(value_str); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
const gpr_atm prev_refcount = gpr_atm_full_fetch_add(&md->refcnt, -1); |
|
|
|
|
GPR_ASSERT(prev_refcount >= 1); |
|
|
|
|