mach_logging.h 6.3 KB

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