#ifndef INCLUDE_PERFETTO_BASE_LOGGING_H_
#define INCLUDE_PERFETTO_BASE_LOGGING_H_
#include <errno.h>
#include <string.h>
#include "perfetto/base/build_config.h"
#include "perfetto/base/compiler.h"
#include "perfetto/base/export.h"
#if defined(__GNUC__) || defined(__clang__)
#pragma GCC system_header
#endif
#if PERFETTO_BUILDFLAG(PERFETTO_FORCE_DCHECK_ON)
#define PERFETTO_DCHECK_IS_ON …
#elif PERFETTO_BUILDFLAG(PERFETTO_FORCE_DCHECK_OFF)
#define PERFETTO_DCHECK_IS_ON …
#elif defined(DCHECK_ALWAYS_ON) || \
(!defined(NDEBUG) && (PERFETTO_BUILDFLAG(PERFETTO_STANDALONE_BUILD) || \
PERFETTO_BUILDFLAG(PERFETTO_CHROMIUM_BUILD) || \
PERFETTO_BUILDFLAG(PERFETTO_ANDROID_BUILD)))
#define PERFETTO_DCHECK_IS_ON() …
#else
#define PERFETTO_DCHECK_IS_ON …
#endif
#if PERFETTO_BUILDFLAG(PERFETTO_FORCE_DLOG_ON)
#define PERFETTO_DLOG_IS_ON …
#elif PERFETTO_BUILDFLAG(PERFETTO_FORCE_DLOG_OFF)
#define PERFETTO_DLOG_IS_ON() …
#else
#define PERFETTO_DLOG_IS_ON …
#endif
#if defined(PERFETTO_ANDROID_ASYNC_SAFE_LOG)
#if !PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
!PERFETTO_BUILDFLAG(PERFETTO_ANDROID_BUILD)
#error "Async-safe logging is limited to Android tree builds"
#endif
#include <async_safe/log.h>
#elif PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
#include <android/log.h>
#endif
#if defined(PERFETTO_ANDROID_ASYNC_SAFE_LOG)
#define PERFETTO_ENABLE_LOG_RING_BUFFER …
#elif PERFETTO_BUILDFLAG(PERFETTO_ANDROID_BUILD)
#define PERFETTO_ENABLE_LOG_RING_BUFFER …
#elif PERFETTO_BUILDFLAG(PERFETTO_STANDALONE_BUILD) && \
(!PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
(defined(__ANDROID_API__) && __ANDROID_API__ >= 21))
#define PERFETTO_ENABLE_LOG_RING_BUFFER …
#else
#define PERFETTO_ENABLE_LOG_RING_BUFFER() …
#endif
namespace perfetto {
namespace base {
constexpr const char* StrEnd(const char* s) { … }
constexpr const char* BasenameRecursive(const char* s,
const char* begin,
const char* end) { … }
constexpr const char* Basename(const char* str) { … }
enum LogLev { … };
struct LogMessageCallbackArgs { … };
LogMessageCallback;
PERFETTO_EXPORT_COMPONENT void SetLogMessageCallback(
LogMessageCallback callback);
PERFETTO_EXPORT_COMPONENT void LogMessage(LogLev,
const char* fname,
int line,
const char* fmt,
...) PERFETTO_PRINTF_FORMAT(4, 5);
PERFETTO_EXPORT_COMPONENT void EnableStacktraceOnCrashForDebug();
#if PERFETTO_ENABLE_LOG_RING_BUFFER()
PERFETTO_EXPORT_COMPONENT void MaybeSerializeLastLogsForCrashReporting();
#else
inline void MaybeSerializeLastLogsForCrashReporting() { … }
#endif
#if defined(PERFETTO_ANDROID_ASYNC_SAFE_LOG)
#define PERFETTO_XLOG …
#elif defined(PERFETTO_DISABLE_LOG)
#define PERFETTO_XLOG …
#else
#define PERFETTO_XLOG(level, fmt, ...) …
#endif
#if defined(_MSC_VER)
#define PERFETTO_IMMEDIATE_CRASH …
#else
#define PERFETTO_IMMEDIATE_CRASH() …
#endif
#if PERFETTO_BUILDFLAG(PERFETTO_VERBOSE_LOGS)
#define PERFETTO_LOG …
#else
#define PERFETTO_LOG(...) …
#endif
#define PERFETTO_ILOG(fmt, ...) …
#define PERFETTO_ELOG(fmt, ...) …
#define PERFETTO_FATAL(fmt, ...) …
#if defined(__GNUC__) || defined(__clang__)
#define PERFETTO_PLOG(x, ...) …
#else
#define PERFETTO_PLOG …
#endif
#define PERFETTO_CHECK(x) …
#if PERFETTO_DLOG_IS_ON()
#define PERFETTO_DLOG …
#if defined(__GNUC__) || defined(__clang__)
#define PERFETTO_DPLOG …
#else
#define PERFETTO_DPLOG …
#endif
#else
#define PERFETTO_DLOG(...) …
#define PERFETTO_DPLOG(...) …
#endif
#if PERFETTO_DCHECK_IS_ON()
#define PERFETTO_DCHECK(x) …
#define PERFETTO_DFATAL(...) …
#define PERFETTO_DFATAL_OR_ELOG(...) …
#else
#define PERFETTO_DCHECK …
#define PERFETTO_DFATAL …
#define PERFETTO_DFATAL_OR_ELOG …
#endif
}
}
#endif