|
|
|
@ -33,6 +33,9 @@ |
|
|
|
|
#include "src/core/lib/surface/channel.h" |
|
|
|
|
#include "src/core/lib/transport/connectivity_state.h" |
|
|
|
|
|
|
|
|
|
grpc_core::DebugOnlyTraceFlag grpc_trace_channel_tracer_refcount( |
|
|
|
|
false, "channel_tracer_refcount"); |
|
|
|
|
|
|
|
|
|
// One node of tracing data
|
|
|
|
|
typedef struct grpc_trace_node { |
|
|
|
|
grpc_slice data; |
|
|
|
@ -58,7 +61,7 @@ struct grpc_channel_tracer { |
|
|
|
|
gpr_timespec time_created; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#ifdef GRPC_CHANNEL_TRACER_REFCOUNT_DEBUG |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
grpc_channel_tracer* grpc_channel_tracer_create(size_t max_nodes, intptr_t uuid, |
|
|
|
|
const char* file, int line, |
|
|
|
|
const char* func) { |
|
|
|
@ -70,8 +73,10 @@ grpc_channel_tracer* grpc_channel_tracer_create(size_t max_nodes, |
|
|
|
|
gpr_zalloc(sizeof(grpc_channel_tracer))); |
|
|
|
|
gpr_mu_init(&tracer->tracer_mu); |
|
|
|
|
gpr_ref_init(&tracer->refs, 1); |
|
|
|
|
#ifdef GRPC_CHANNEL_TRACER_REFCOUNT_DEBUG |
|
|
|
|
gpr_log(GPR_DEBUG, "%p create [%s:%d %s]", tracer, file, line, func); |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
if (grpc_trace_channel_tracer_refcount.enabled()) { |
|
|
|
|
gpr_log(GPR_DEBUG, "%p create [%s:%d %s]", tracer, file, line, func); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
tracer->channel_uuid = uuid; |
|
|
|
|
tracer->max_list_size = max_nodes; |
|
|
|
@ -79,14 +84,16 @@ grpc_channel_tracer* grpc_channel_tracer_create(size_t max_nodes, |
|
|
|
|
return tracer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef GRPC_CHANNEL_TRACER_REFCOUNT_DEBUG |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
grpc_channel_tracer* grpc_channel_tracer_ref(grpc_channel_tracer* tracer, |
|
|
|
|
const char* file, int line, |
|
|
|
|
const char* func) { |
|
|
|
|
if (!tracer) return tracer; |
|
|
|
|
gpr_log(GPR_DEBUG, "%p: %" PRIdPTR " -> %" PRIdPTR " [%s:%d %s]", tracer, |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count), |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count) + 1, file, line, func); |
|
|
|
|
if (grpc_trace_channel_tracer_refcount.enabled()) { |
|
|
|
|
gpr_log(GPR_DEBUG, "%p: %" PRIdPTR " -> %" PRIdPTR " [%s:%d %s]", tracer, |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count), |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count) + 1, file, line, func); |
|
|
|
|
} |
|
|
|
|
gpr_ref(&tracer->refs); |
|
|
|
|
return tracer; |
|
|
|
|
} |
|
|
|
@ -116,13 +123,15 @@ static void grpc_channel_tracer_destroy(grpc_channel_tracer* tracer) { |
|
|
|
|
gpr_free(tracer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef GRPC_CHANNEL_TRACER_REFCOUNT_DEBUG |
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
void grpc_channel_tracer_unref(grpc_channel_tracer* tracer, const char* file, |
|
|
|
|
int line, const char* func) { |
|
|
|
|
if (!tracer) return; |
|
|
|
|
gpr_log(GPR_DEBUG, "%p: %" PRIdPTR " -> %" PRIdPTR " [%s:%d %s]", tracer, |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count), |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count) - 1, file, line, func); |
|
|
|
|
if (grpc_trace_channel_tracer_refcount.enabled()) { |
|
|
|
|
gpr_log(GPR_DEBUG, "%p: %" PRIdPTR " -> %" PRIdPTR " [%s:%d %s]", tracer, |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count), |
|
|
|
|
gpr_atm_no_barrier_load(&tracer->refs.count) - 1, file, line, func); |
|
|
|
|
} |
|
|
|
|
if (gpr_unref(&tracer->refs)) { |
|
|
|
|
grpc_channel_tracer_destroy(tracer); |
|
|
|
|
} |
|
|
|
|