1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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_OSSTATUS_LOGGING_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_APPLE_OSSTATUS_LOGGING_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 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/build_config.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS) 15*6777b538SAndroid Build Coastguard Worker #include <MacTypes.h> 16*6777b538SAndroid Build Coastguard Worker #else 17*6777b538SAndroid Build Coastguard Worker #include <libkern/OSTypes.h> 18*6777b538SAndroid Build Coastguard Worker #endif 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // Use the OSSTATUS_LOG family to log messages related to errors in macOS/iOS 21*6777b538SAndroid Build Coastguard Worker // system routines that report status via an OSStatus or OSErr value. It is 22*6777b538SAndroid Build Coastguard Worker // similar to the PLOG family which operates on errno, but because there is no 23*6777b538SAndroid Build Coastguard Worker // global (or thread-local) OSStatus or OSErr value, the specific error must 24*6777b538SAndroid Build Coastguard Worker // be supplied as an argument to the OSSTATUS_LOG macro. The message logged 25*6777b538SAndroid Build Coastguard Worker // will contain the symbolic constant name corresponding to the status value, 26*6777b538SAndroid Build Coastguard Worker // along with the value itself. 27*6777b538SAndroid Build Coastguard Worker // 28*6777b538SAndroid Build Coastguard Worker // OSErr is just an older 16-bit form of the newer 32-bit OSStatus. Despite 29*6777b538SAndroid Build Coastguard Worker // the name, OSSTATUS_LOG can be used equally well for OSStatus and OSErr. 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker namespace logging { 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker // Returns a UTF8 description from an OSStatus/OSErr value. 34*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string DescriptionFromOSStatus(OSStatus err); 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT OSStatusLogMessage : public logging::LogMessage { 37*6777b538SAndroid Build Coastguard Worker public: 38*6777b538SAndroid Build Coastguard Worker OSStatusLogMessage(const char* file_path, 39*6777b538SAndroid Build Coastguard Worker int line, 40*6777b538SAndroid Build Coastguard Worker LogSeverity severity, 41*6777b538SAndroid Build Coastguard Worker OSStatus status); 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker OSStatusLogMessage(const OSStatusLogMessage&) = delete; 44*6777b538SAndroid Build Coastguard Worker OSStatusLogMessage& operator=(const OSStatusLogMessage&) = delete; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker ~OSStatusLogMessage() 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 OSStatus status_; 53*6777b538SAndroid Build Coastguard Worker }; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT OSStatusLogMessageFatal final : public OSStatusLogMessage { 56*6777b538SAndroid Build Coastguard Worker public: 57*6777b538SAndroid Build Coastguard Worker using OSStatusLogMessage::OSStatusLogMessage; 58*6777b538SAndroid Build Coastguard Worker [[noreturn]] ~OSStatusLogMessageFatal() 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 MAC_DVLOG_IS_ON(verbose_level) VLOG_IS_ON(verbose_level) 65*6777b538SAndroid Build Coastguard Worker #else 66*6777b538SAndroid Build Coastguard Worker #define MAC_DVLOG_IS_ON(verbose_level) 0 67*6777b538SAndroid Build Coastguard Worker #endif 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_LOG_STREAM(severity, status) \ 70*6777b538SAndroid Build Coastguard Worker COMPACT_GOOGLE_LOG_EX_##severity(OSStatusLogMessage, status).stream() 71*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_VLOG_STREAM(verbose_level, status) \ 72*6777b538SAndroid Build Coastguard Worker logging::OSStatusLogMessage(__FILE__, __LINE__, -verbose_level, status) \ 73*6777b538SAndroid Build Coastguard Worker .stream() 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_LOG(severity, status) \ 76*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_LOG_STREAM(severity, status), LOG_IS_ON(severity)) 77*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_LOG_IF(severity, condition, status) \ 78*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_LOG_STREAM(severity, status), \ 79*6777b538SAndroid Build Coastguard Worker LOG_IS_ON(severity) && (condition)) 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_VLOG(verbose_level, status) \ 82*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_VLOG_STREAM(verbose_level, status), \ 83*6777b538SAndroid Build Coastguard Worker VLOG_IS_ON(verbose_level)) 84*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_VLOG_IF(verbose_level, condition, status) \ 85*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_VLOG_STREAM(verbose_level, status), \ 86*6777b538SAndroid Build Coastguard Worker VLOG_IS_ON(verbose_level) && (condition)) 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_CHECK(condition, status) \ 89*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_LOG_STREAM(FATAL, status), !(condition)) \ 90*6777b538SAndroid Build Coastguard Worker << "Check failed: " #condition << ". " 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_DLOG(severity, status) \ 93*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_LOG_STREAM(severity, status), DLOG_IS_ON(severity)) 94*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_DLOG_IF(severity, condition, status) \ 95*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_LOG_STREAM(severity, status), \ 96*6777b538SAndroid Build Coastguard Worker DLOG_IS_ON(severity) && (condition)) 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_DVLOG(verbose_level, status) \ 99*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_VLOG_STREAM(verbose_level, status), \ 100*6777b538SAndroid Build Coastguard Worker MAC_DVLOG_IS_ON(verbose_level)) 101*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_DVLOG_IF(verbose_level, condition, status) \ 102*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_VLOG_STREAM(verbose_level, status), \ 103*6777b538SAndroid Build Coastguard Worker MAC_DVLOG_IS_ON(verbose_level) && (condition)) 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker #define OSSTATUS_DCHECK(condition, status) \ 106*6777b538SAndroid Build Coastguard Worker LAZY_STREAM(OSSTATUS_LOG_STREAM(FATAL, status), \ 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 #endif // BASE_APPLE_OSSTATUS_LOGGING_H_ 111