diff options
author | 2017-11-20 10:50:38 -0500 | |
---|---|---|
committer | 2017-11-20 10:56:04 -0500 | |
commit | 993e9f06921123a9220031398ecfbf52a6114dce (patch) | |
tree | f15a85d3446e8a8495e8fb5b02a1f7c4aa26c6fc /src/core/lib/debug | |
parent | 46f9175ba3a27958a1655707d6014de1ba3ce4d5 (diff) | |
parent | 9addd2eef21a96e52135dc9369566d8452412763 (diff) |
Merge branch 'master' of https://github.com/grpc/grpc into no-more-extern-c
Diffstat (limited to 'src/core/lib/debug')
-rw-r--r-- | src/core/lib/debug/trace.cc | 119 | ||||
-rw-r--r-- | src/core/lib/debug/trace.h | 75 |
2 files changed, 118 insertions, 76 deletions
diff --git a/src/core/lib/debug/trace.cc b/src/core/lib/debug/trace.cc index 9c75ef124a..4c63983bdc 100644 --- a/src/core/lib/debug/trace.cc +++ b/src/core/lib/debug/trace.cc @@ -27,26 +27,61 @@ int grpc_tracer_set_enabled(const char* name, int enabled); -typedef struct tracer { - grpc_tracer_flag* flag; - struct tracer* next; -} tracer; -static tracer* tracers; - -#ifdef GRPC_THREADSAFE_TRACER -#define TRACER_SET(flag, on) gpr_atm_no_barrier_store(&(flag).value, (on)) -#else -#define TRACER_SET(flag, on) (flag).value = (on) -#endif - -void grpc_register_tracer(grpc_tracer_flag* flag) { - tracer* t = (tracer*)gpr_malloc(sizeof(*t)); - t->flag = flag; - t->next = tracers; - TRACER_SET(*flag, false); - tracers = t; +namespace grpc_core { + +TraceFlag* TraceFlagList::root_tracer_ = nullptr; + +bool TraceFlagList::Set(const char* name, bool enabled) { + TraceFlag* t; + if (0 == strcmp(name, "all")) { + for (t = root_tracer_; t; t = t->next_tracer_) { + t->set_enabled(enabled); + } + } else if (0 == strcmp(name, "list_tracers")) { + LogAllTracers(); + } else if (0 == strcmp(name, "refcount")) { + for (t = root_tracer_; t; t = t->next_tracer_) { + if (strstr(t->name_, "refcount") != nullptr) { + t->set_enabled(enabled); + } + } + } else { + bool found = false; + for (t = root_tracer_; t; t = t->next_tracer_) { + if (0 == strcmp(name, t->name_)) { + t->set_enabled(enabled); + found = true; + } + } + if (!found) { + gpr_log(GPR_ERROR, "Unknown trace var: '%s'", name); + return false; /* early return */ + } + } + return true; +} + +void TraceFlagList::Add(TraceFlag* flag) { + flag->next_tracer_ = root_tracer_; + root_tracer_ = flag; } +void TraceFlagList::LogAllTracers() { + gpr_log(GPR_DEBUG, "available tracers:"); + TraceFlag* t; + for (t = root_tracer_; t != nullptr; t = t->next_tracer_) { + gpr_log(GPR_DEBUG, "\t%s", t->name_); + } +} + +// Flags register themselves on the list during construction +TraceFlag::TraceFlag(bool default_enabled, const char* name) + : name_(name), value_(default_enabled) { + TraceFlagList::Add(this); +} + +} // namespace grpc_core + static void add(const char* beg, const char* end, char*** ss, size_t* ns) { size_t n = *ns; size_t np = n + 1; @@ -80,9 +115,9 @@ static void parse(const char* s) { for (i = 0; i < nstrings; i++) { if (strings[i][0] == '-') { - grpc_tracer_set_enabled(strings[i] + 1, 0); + grpc_core::TraceFlagList::Set(strings[i] + 1, false); } else { - grpc_tracer_set_enabled(strings[i], 1); + grpc_core::TraceFlagList::Set(strings[i], true); } } @@ -92,14 +127,6 @@ static void parse(const char* s) { gpr_free(strings); } -static void list_tracers() { - gpr_log(GPR_DEBUG, "available tracers:"); - tracer* t; - for (t = tracers; t; t = t->next) { - gpr_log(GPR_DEBUG, "\t%s", t->flag->name); - } -} - void grpc_tracer_init(const char* env_var) { char* e = gpr_getenv(env_var); if (e != nullptr) { @@ -108,40 +135,8 @@ void grpc_tracer_init(const char* env_var) { } } -void grpc_tracer_shutdown(void) { - while (tracers) { - tracer* t = tracers; - tracers = t->next; - gpr_free(t); - } -} +void grpc_tracer_shutdown(void) {} int grpc_tracer_set_enabled(const char* name, int enabled) { - tracer* t; - if (0 == strcmp(name, "all")) { - for (t = tracers; t; t = t->next) { - TRACER_SET(*t->flag, enabled); - } - } else if (0 == strcmp(name, "list_tracers")) { - list_tracers(); - } else if (0 == strcmp(name, "refcount")) { - for (t = tracers; t; t = t->next) { - if (strstr(t->flag->name, "refcount") != nullptr) { - TRACER_SET(*t->flag, enabled); - } - } - } else { - int found = 0; - for (t = tracers; t; t = t->next) { - if (0 == strcmp(name, t->flag->name)) { - TRACER_SET(*t->flag, enabled); - found = 1; - } - } - if (!found) { - gpr_log(GPR_ERROR, "Unknown trace var: '%s'", name); - return 0; /* early return */ - } - } - return 1; + return grpc_core::TraceFlagList::Set(name, enabled != 0); } diff --git a/src/core/lib/debug/trace.h b/src/core/lib/debug/trace.h index 66cca14447..55713c8925 100644 --- a/src/core/lib/debug/trace.h +++ b/src/core/lib/debug/trace.h @@ -23,33 +23,80 @@ #include <grpc/support/port_platform.h> #include <stdbool.h> +void grpc_tracer_init(const char* env_var_name); +void grpc_tracer_shutdown(void); + #if defined(__has_feature) #if __has_feature(thread_sanitizer) #define GRPC_THREADSAFE_TRACER #endif #endif -typedef struct { +namespace grpc_core { + +class TraceFlag; +class TraceFlagList { + public: + static bool Set(const char* name, bool enabled); + static void Add(TraceFlag* flag); + + private: + static void LogAllTracers(); + static TraceFlag* root_tracer_; +}; + +namespace testing { +void grpc_tracer_enable_flag(grpc_core::TraceFlag* flag); +} + +class TraceFlag { + public: + TraceFlag(bool default_enabled, const char* name); + ~TraceFlag() {} + + const char* name() const { return name_; } + + bool enabled() { #ifdef GRPC_THREADSAFE_TRACER - gpr_atm value; + return gpr_atm_no_barrier_load(&value_) != 0; #else - bool value; + return value_; #endif - const char* name; -} grpc_tracer_flag; + } + + private: + friend void grpc_core::testing::grpc_tracer_enable_flag(TraceFlag* flag); + friend class TraceFlagList; + void set_enabled(bool enabled) { #ifdef GRPC_THREADSAFE_TRACER -#define GRPC_TRACER_ON(flag) (gpr_atm_no_barrier_load(&(flag).value) != 0) -#define GRPC_TRACER_INITIALIZER(on, name) \ - { (gpr_atm)(on), (name) } + gpr_atm_no_barrier_store(&value_, enabled); #else -#define GRPC_TRACER_ON(flag) ((flag).value) -#define GRPC_TRACER_INITIALIZER(on, name) \ - { (on), (name) } + value_ = enabled; #endif + } -void grpc_register_tracer(grpc_tracer_flag* flag); -void grpc_tracer_init(const char* env_var_name); -void grpc_tracer_shutdown(void); + TraceFlag* next_tracer_; + const char* const name_; +#ifdef GRPC_THREADSAFE_TRACER + gpr_atm value_; +#else + bool value_; +#endif +}; + +#ifndef NDEBUG +typedef TraceFlag DebugOnlyTraceFlag; +#else +class DebugOnlyTraceFlag { + public: + DebugOnlyTraceFlag(bool default_enabled, const char* name) {} + bool enabled() { return false; } + private: + void set_enabled(bool enabled) {} +}; +#endif + +} // namespace grpc_core #endif /* GRPC_CORE_LIB_DEBUG_TRACE_H */ |