|  | // Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_MAC_MACH_LOGGING_H_ | 
|  | #define BASE_MAC_MACH_LOGGING_H_ | 
|  |  | 
|  | #include <mach/mach.h> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/macros.h" | 
|  | #include "build/build_config.h" | 
|  |  | 
|  | // Use the MACH_LOG family of macros along with a mach_error_t (kern_return_t) | 
|  | // containing a Mach error. The error value will be decoded so that logged | 
|  | // messages explain the error. | 
|  | // | 
|  | // Use the BOOTSTRAP_LOG family of macros specifically for errors that occur | 
|  | // while interoperating with the bootstrap subsystem. These errors will first | 
|  | // be looked up as bootstrap error messages. If no match is found, they will | 
|  | // be treated as generic Mach errors, as in MACH_LOG. | 
|  | // | 
|  | // Examples: | 
|  | // | 
|  | //   kern_return_t kr = mach_timebase_info(&info); | 
|  | //   if (kr != KERN_SUCCESS) { | 
|  | //     MACH_LOG(ERROR, kr) << "mach_timebase_info"; | 
|  | //   } | 
|  | // | 
|  | //   kr = vm_deallocate(task, address, size); | 
|  | //   MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate"; | 
|  |  | 
|  | namespace logging { | 
|  |  | 
|  | class BASE_EXPORT MachLogMessage : public logging::LogMessage { | 
|  | public: | 
|  | MachLogMessage(const char* file_path, | 
|  | int line, | 
|  | LogSeverity severity, | 
|  | mach_error_t mach_err); | 
|  | ~MachLogMessage(); | 
|  |  | 
|  | private: | 
|  | mach_error_t mach_err_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(MachLogMessage); | 
|  | }; | 
|  |  | 
|  | }  // namespace logging | 
|  |  | 
|  | #if defined(NDEBUG) | 
|  | #define MACH_DVLOG_IS_ON(verbose_level) 0 | 
|  | #else | 
|  | #define MACH_DVLOG_IS_ON(verbose_level) VLOG_IS_ON(verbose_level) | 
|  | #endif | 
|  |  | 
|  | #define MACH_LOG_STREAM(severity, mach_err) \ | 
|  | COMPACT_GOOGLE_LOG_EX_ ## severity(MachLogMessage, mach_err).stream() | 
|  | #define MACH_VLOG_STREAM(verbose_level, mach_err) \ | 
|  | logging::MachLogMessage(__FILE__, __LINE__, \ | 
|  | -verbose_level, mach_err).stream() | 
|  |  | 
|  | #define MACH_LOG(severity, mach_err) \ | 
|  | LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), LOG_IS_ON(severity)) | 
|  | #define MACH_LOG_IF(severity, condition, mach_err) \ | 
|  | LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ | 
|  | LOG_IS_ON(severity) && (condition)) | 
|  |  | 
|  | #define MACH_VLOG(verbose_level, mach_err) \ | 
|  | LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ | 
|  | VLOG_IS_ON(verbose_level)) | 
|  | #define MACH_VLOG_IF(verbose_level, condition, mach_err) \ | 
|  | LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ | 
|  | VLOG_IS_ON(verbose_level) && (condition)) | 
|  |  | 
|  | #define MACH_CHECK(condition, mach_err) \ | 
|  | LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), !(condition)) \ | 
|  | << "Check failed: " # condition << ". " | 
|  |  | 
|  | #define MACH_DLOG(severity, mach_err) \ | 
|  | LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), DLOG_IS_ON(severity)) | 
|  | #define MACH_DLOG_IF(severity, condition, mach_err) \ | 
|  | LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ | 
|  | DLOG_IS_ON(severity) && (condition)) | 
|  |  | 
|  | #define MACH_DVLOG(verbose_level, mach_err) \ | 
|  | LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ | 
|  | MACH_DVLOG_IS_ON(verbose_level)) | 
|  | #define MACH_DVLOG_IF(verbose_level, condition, mach_err) \ | 
|  | LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ | 
|  | MACH_DVLOG_IS_ON(verbose_level) && (condition)) | 
|  |  | 
|  | #define MACH_DCHECK(condition, mach_err)        \ | 
|  | LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), \ | 
|  | DCHECK_IS_ON() && !(condition))   \ | 
|  | << "Check failed: " #condition << ". " | 
|  |  | 
|  | #if !defined(OS_IOS) | 
|  |  | 
|  | namespace logging { | 
|  |  | 
|  | class BASE_EXPORT BootstrapLogMessage : public logging::LogMessage { | 
|  | public: | 
|  | BootstrapLogMessage(const char* file_path, | 
|  | int line, | 
|  | LogSeverity severity, | 
|  | kern_return_t bootstrap_err); | 
|  | ~BootstrapLogMessage(); | 
|  |  | 
|  | private: | 
|  | kern_return_t bootstrap_err_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(BootstrapLogMessage); | 
|  | }; | 
|  |  | 
|  | }  // namespace logging | 
|  |  | 
|  | #define BOOTSTRAP_DVLOG_IS_ON MACH_DVLOG_IS_ON | 
|  |  | 
|  | #define BOOTSTRAP_LOG_STREAM(severity, bootstrap_err) \ | 
|  | COMPACT_GOOGLE_LOG_EX_ ## severity(BootstrapLogMessage, \ | 
|  | bootstrap_err).stream() | 
|  | #define BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err) \ | 
|  | logging::BootstrapLogMessage(__FILE__, __LINE__, \ | 
|  | -verbose_level, bootstrap_err).stream() | 
|  |  | 
|  | #define BOOTSTRAP_LOG(severity, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, \ | 
|  | bootstrap_err), LOG_IS_ON(severity)) | 
|  | #define BOOTSTRAP_LOG_IF(severity, condition, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ | 
|  | LOG_IS_ON(severity) && (condition)) | 
|  |  | 
|  | #define BOOTSTRAP_VLOG(verbose_level, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ | 
|  | VLOG_IS_ON(verbose_level)) | 
|  | #define BOOTSTRAP_VLOG_IF(verbose_level, condition, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ | 
|  | VLOG_IS_ON(verbose_level) && (condition)) | 
|  |  | 
|  | #define BOOTSTRAP_CHECK(condition, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), !(condition)) \ | 
|  | << "Check failed: " # condition << ". " | 
|  |  | 
|  | #define BOOTSTRAP_DLOG(severity, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ | 
|  | DLOG_IS_ON(severity)) | 
|  | #define BOOTSTRAP_DLOG_IF(severity, condition, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ | 
|  | DLOG_IS_ON(severity) && (condition)) | 
|  |  | 
|  | #define BOOTSTRAP_DVLOG(verbose_level, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ | 
|  | BOOTSTRAP_DVLOG_IS_ON(verbose_level)) | 
|  | #define BOOTSTRAP_DVLOG_IF(verbose_level, condition, bootstrap_err) \ | 
|  | LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ | 
|  | BOOTSTRAP_DVLOG_IS_ON(verbose_level) && (condition)) | 
|  |  | 
|  | #define BOOTSTRAP_DCHECK(condition, bootstrap_err)        \ | 
|  | LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), \ | 
|  | DCHECK_IS_ON() && !(condition))             \ | 
|  | << "Check failed: " #condition << ". " | 
|  |  | 
|  | #endif  // !OS_IOS | 
|  |  | 
|  | #endif  // BASE_MAC_MACH_LOGGING_H_ |