diff options
Diffstat (limited to 'base/include/base/logging.h')
-rw-r--r-- | base/include/base/logging.h | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/base/include/base/logging.h b/base/include/base/logging.h index 283a7bc90..30f690657 100644 --- a/base/include/base/logging.h +++ b/base/include/base/logging.h @@ -87,30 +87,64 @@ extern void InitLogging(char* argv[]); // Replace the current logger. extern void SetLogger(LogFunction&& logger); +// Get the minimum severity level for logging. +extern LogSeverity GetMinimumLogSeverity(); + +class ErrnoRestorer { + public: + ErrnoRestorer() + : saved_errno_(errno) { + } + + ~ErrnoRestorer() { + errno = saved_errno_; + } + + // Allow this object to evaluate to false which is useful in macros. + operator bool() const { + return false; + } + + private: + const int saved_errno_; + + DISALLOW_COPY_AND_ASSIGN(ErrnoRestorer); +}; + // Logs a message to logcat on Android otherwise to stderr. If the severity is // FATAL it also causes an abort. For example: // // LOG(FATAL) << "We didn't expect to reach here"; -#define LOG(severity) \ - ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::DEFAULT, \ - ::android::base::severity, -1).stream() +#define LOG(severity) LOG_TO(DEFAULT, severity) // Logs a message to logcat with the specified log ID on Android otherwise to // stderr. If the severity is FATAL it also causes an abort. -#define LOG_TO(dest, severity) \ - ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::dest, \ - ::android::base::severity, -1).stream() +// Use an if-else statement instead of just an if statement here. So if there is a +// else statement after LOG() macro, it won't bind to the if statement in the macro. +// do-while(0) statement doesn't work here. Because we need to support << operator +// following the macro, like "LOG(DEBUG) << xxx;". +#define LOG_TO(dest, severity) \ + if (LIKELY(::android::base::severity < ::android::base::GetMinimumLogSeverity())) \ + ; \ + else \ + ::android::base::ErrnoRestorer() ? *(std::ostream*)nullptr : \ + ::android::base::LogMessage(__FILE__, __LINE__, \ + ::android::base::dest, \ + ::android::base::severity, -1).stream() // A variant of LOG that also logs the current errno value. To be used when // library calls fail. -#define PLOG(severity) \ - ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::DEFAULT, \ - ::android::base::severity, errno).stream() +#define PLOG(severity) PLOG_TO(DEFAULT, severity) // Behaves like PLOG, but logs to the specified log ID. -#define PLOG_TO(dest, severity) \ - ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::dest, \ - ::android::base::severity, errno).stream() +#define PLOG_TO(dest, severity) \ + if (LIKELY(::android::base::severity < ::android::base::GetMinimumLogSeverity())) \ + ; \ + else \ + ::android::base::ErrnoRestorer() ? *(std::ostream*)nullptr : \ + ::android::base::LogMessage(__FILE__, __LINE__, \ + ::android::base::dest, \ + ::android::base::severity, errno).stream() // Marker that code is yet to be implemented. #define UNIMPLEMENTED(level) \ @@ -122,11 +156,13 @@ extern void SetLogger(LogFunction&& logger); // // CHECK(false == true) results in a log message of // "Check failed: false == true". -#define CHECK(x) \ - if (UNLIKELY(!(x))) \ - ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::DEFAULT, \ - ::android::base::FATAL, -1).stream() \ - << "Check failed: " #x << " " +#define CHECK(x) \ + if (LIKELY((x))) \ + ; \ + else \ + ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::DEFAULT, \ + ::android::base::FATAL, -1).stream() \ + << "Check failed: " #x << " " // Helper for CHECK_xx(x,y) macros. #define CHECK_OP(LHS, RHS, OP) \ @@ -153,7 +189,9 @@ extern void SetLogger(LogFunction&& logger); // Helper for CHECK_STRxx(s1,s2) macros. #define CHECK_STROP(s1, s2, sense) \ - if (UNLIKELY((strcmp(s1, s2) == 0) != sense)) \ + if (LIKELY((strcmp(s1, s2) == 0) == sense)) \ + ; \ + else \ LOG(FATAL) << "Check failed: " \ << "\"" << s1 << "\"" \ << (sense ? " == " : " != ") << "\"" << s2 << "\"" |