1 // Copyright 2014 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef BASE_APPLE_MACH_LOGGING_H_ 6 #define BASE_APPLE_MACH_LOGGING_H_ 7 8 #include <mach/mach.h> 9 10 #include "base/base_export.h" 11 #include "base/logging.h" 12 #include "build/blink_buildflags.h" 13 #include "build/build_config.h" 14 15 // Use the MACH_LOG family of macros along with a mach_error_t (kern_return_t) 16 // containing a Mach error. The error value will be decoded so that logged 17 // messages explain the error. 18 // 19 // Use the BOOTSTRAP_LOG family of macros specifically for errors that occur 20 // while interoperating with the bootstrap subsystem. These errors will first 21 // be looked up as bootstrap error messages. If no match is found, they will 22 // be treated as generic Mach errors, as in MACH_LOG. 23 // 24 // Examples: 25 // 26 // kern_return_t kr = mach_timebase_info(&info); 27 // if (kr != KERN_SUCCESS) { 28 // MACH_LOG(ERROR, kr) << "mach_timebase_info"; 29 // } 30 // 31 // kr = vm_deallocate(task, address, size); 32 // MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate"; 33 34 namespace logging { 35 36 class BASE_EXPORT MachLogMessage : public logging::LogMessage { 37 public: 38 MachLogMessage(const char* file_path, 39 int line, 40 LogSeverity severity, 41 mach_error_t mach_err); 42 43 MachLogMessage(const MachLogMessage&) = delete; 44 MachLogMessage& operator=(const MachLogMessage&) = delete; 45 46 ~MachLogMessage() override; 47 48 protected: 49 void AppendError(); 50 51 private: 52 mach_error_t mach_err_; 53 }; 54 55 class BASE_EXPORT MachLogMessageFatal final : public MachLogMessage { 56 public: 57 using MachLogMessage::MachLogMessage; 58 [[noreturn]] ~MachLogMessageFatal() override; 59 }; 60 61 } // namespace logging 62 63 #if DCHECK_IS_ON() 64 #define MACH_DVLOG_IS_ON(verbose_level) VLOG_IS_ON(verbose_level) 65 #else 66 #define MACH_DVLOG_IS_ON(verbose_level) 0 67 #endif 68 69 #define MACH_LOG_STREAM(severity, mach_err) \ 70 COMPACT_GOOGLE_LOG_EX_ ## severity(MachLogMessage, mach_err).stream() 71 #define MACH_VLOG_STREAM(verbose_level, mach_err) \ 72 logging::MachLogMessage(__FILE__, __LINE__, \ 73 -verbose_level, mach_err).stream() 74 75 #define MACH_LOG(severity, mach_err) \ 76 LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), LOG_IS_ON(severity)) 77 #define MACH_LOG_IF(severity, condition, mach_err) \ 78 LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ 79 LOG_IS_ON(severity) && (condition)) 80 81 #define MACH_VLOG(verbose_level, mach_err) \ 82 LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ 83 VLOG_IS_ON(verbose_level)) 84 #define MACH_VLOG_IF(verbose_level, condition, mach_err) \ 85 LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ 86 VLOG_IS_ON(verbose_level) && (condition)) 87 88 #define MACH_CHECK(condition, mach_err) \ 89 LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), !(condition)) \ 90 << "Check failed: " # condition << ". " 91 92 #define MACH_DLOG(severity, mach_err) \ 93 LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), DLOG_IS_ON(severity)) 94 #define MACH_DLOG_IF(severity, condition, mach_err) \ 95 LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ 96 DLOG_IS_ON(severity) && (condition)) 97 98 #define MACH_DVLOG(verbose_level, mach_err) \ 99 LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ 100 MACH_DVLOG_IS_ON(verbose_level)) 101 #define MACH_DVLOG_IF(verbose_level, condition, mach_err) \ 102 LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ 103 MACH_DVLOG_IS_ON(verbose_level) && (condition)) 104 105 #define MACH_DCHECK(condition, mach_err) \ 106 LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), \ 107 DCHECK_IS_ON() && !(condition)) \ 108 << "Check failed: " #condition << ". " 109 110 #if BUILDFLAG(USE_BLINK) 111 112 namespace logging { 113 114 class BASE_EXPORT BootstrapLogMessage : public logging::LogMessage { 115 public: 116 BootstrapLogMessage(const char* file_path, 117 int line, 118 LogSeverity severity, 119 kern_return_t bootstrap_err); 120 121 BootstrapLogMessage(const BootstrapLogMessage&) = delete; 122 BootstrapLogMessage& operator=(const BootstrapLogMessage&) = delete; 123 124 ~BootstrapLogMessage() override; 125 126 protected: 127 void AppendError(); 128 129 private: 130 kern_return_t bootstrap_err_; 131 }; 132 133 class BASE_EXPORT BootstrapLogMessageFatal final : public BootstrapLogMessage { 134 public: 135 using BootstrapLogMessage::BootstrapLogMessage; 136 [[noreturn]] ~BootstrapLogMessageFatal() override; 137 }; 138 139 } // namespace logging 140 141 #define BOOTSTRAP_DVLOG_IS_ON MACH_DVLOG_IS_ON 142 143 #define BOOTSTRAP_LOG_STREAM(severity, bootstrap_err) \ 144 COMPACT_GOOGLE_LOG_EX_ ## severity(BootstrapLogMessage, \ 145 bootstrap_err).stream() 146 #define BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err) \ 147 logging::BootstrapLogMessage(__FILE__, __LINE__, \ 148 -verbose_level, bootstrap_err).stream() 149 150 #define BOOTSTRAP_LOG(severity, bootstrap_err) \ 151 LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, \ 152 bootstrap_err), LOG_IS_ON(severity)) 153 #define BOOTSTRAP_LOG_IF(severity, condition, bootstrap_err) \ 154 LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ 155 LOG_IS_ON(severity) && (condition)) 156 157 #define BOOTSTRAP_VLOG(verbose_level, bootstrap_err) \ 158 LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ 159 VLOG_IS_ON(verbose_level)) 160 #define BOOTSTRAP_VLOG_IF(verbose_level, condition, bootstrap_err) \ 161 LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ 162 VLOG_IS_ON(verbose_level) && (condition)) 163 164 #define BOOTSTRAP_CHECK(condition, bootstrap_err) \ 165 LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), !(condition)) \ 166 << "Check failed: " # condition << ". " 167 168 #define BOOTSTRAP_DLOG(severity, bootstrap_err) \ 169 LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ 170 DLOG_IS_ON(severity)) 171 #define BOOTSTRAP_DLOG_IF(severity, condition, bootstrap_err) \ 172 LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ 173 DLOG_IS_ON(severity) && (condition)) 174 175 #define BOOTSTRAP_DVLOG(verbose_level, bootstrap_err) \ 176 LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ 177 BOOTSTRAP_DVLOG_IS_ON(verbose_level)) 178 #define BOOTSTRAP_DVLOG_IF(verbose_level, condition, bootstrap_err) \ 179 LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ 180 BOOTSTRAP_DVLOG_IS_ON(verbose_level) && (condition)) 181 182 #define BOOTSTRAP_DCHECK(condition, bootstrap_err) \ 183 LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), \ 184 DCHECK_IS_ON() && !(condition)) \ 185 << "Check failed: " #condition << ". " 186 187 #endif // BUILDFLAG(USE_BLINK) 188 189 #endif // BASE_APPLE_MACH_LOGGING_H_ 190