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