#ifndef GRPC_SRC_CORE_LIB_DEBUG_TRACE_H
#define GRPC_SRC_CORE_LIB_DEBUG_TRACE_H
#include <grpc/support/port_platform.h>
#include <atomic>
#include <map>
#include <string>
#include "absl/strings/string_view.h"
void grpc_tracer_init();
void grpc_tracer_shutdown(void);
namespace grpc_core {
class TraceFlag;
class TraceFlagList {
public:
static bool Set(absl::string_view name, bool enabled);
static void Add(TraceFlag* flag);
static void SaveTo(std::map<std::string, bool>& values);
private:
static void LogAllTracers();
static TraceFlag* root_tracer_;
};
namespace testing {
void grpc_tracer_enable_flag(TraceFlag* flag);
}
class TraceFlag {
public:
TraceFlag(bool default_enabled, const char* name);
~TraceFlag() = default;
const char* name() const { return name_; }
#define GRPC_USE_TRACERS
#if defined(GRPC_USE_TRACERS) || !defined(NDEBUG)
bool enabled() { return value_.load(std::memory_order_relaxed); }
#else
bool enabled() { return false; }
#endif
private:
friend void testing::grpc_tracer_enable_flag(TraceFlag* flag);
friend class TraceFlagList;
void set_enabled(bool enabled) {
value_.store(enabled, std::memory_order_relaxed);
}
TraceFlag* next_tracer_;
const char* const name_;
std::atomic<bool> value_;
};
#define GRPC_TRACE_FLAG_ENABLED(f) GPR_UNLIKELY((f).enabled())
#ifndef NDEBUG
typedef TraceFlag DebugOnlyTraceFlag;
#else
class DebugOnlyTraceFlag {
public:
constexpr DebugOnlyTraceFlag(bool , const char* ) {
}
constexpr bool enabled() const { return false; }
constexpr const char* name() const { return "DebugOnlyTraceFlag"; }
private:
void set_enabled(bool ) {}
};
#endif
class SavedTraceFlags {
public:
SavedTraceFlags();
void Restore();
private:
std::map<std::string, bool> values_;
};
}
#endif