1 // Copyright 2019 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 NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_LOGGING_IMPL_H_ 6 #define NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_LOGGING_IMPL_H_ 7 8 #include <vector> 9 10 #include "base/check_op.h" 11 #include "base/logging.h" 12 #include "base/notreached.h" 13 #include "build/build_config.h" 14 #include "quiche/common/platform/api/quiche_export.h" 15 #include "third_party/abseil-cpp/absl/base/optimization.h" 16 17 #define QUICHE_LOG_IMPL(severity) QUICHE_CHROMIUM_LOG_##severity 18 #define QUICHE_VLOG_IMPL(verbose_level) VLOG(verbose_level) 19 #define QUICHE_LOG_EVERY_N_SEC_IMPL(severity, seconds) QUICHE_LOG_IMPL(severity) 20 #define QUICHE_LOG_FIRST_N_IMPL(severity, n) QUICHE_LOG_IMPL(severity) 21 #define QUICHE_DLOG_IMPL(severity) QUICHE_CHROMIUM_DLOG_##severity 22 #define QUICHE_DLOG_IF_IMPL(severity, condition) \ 23 QUICHE_CHROMIUM_DLOG_IF_##severity(condition) 24 #define QUICHE_LOG_IF_IMPL(severity, condition) \ 25 QUICHE_CHROMIUM_LOG_IF_##severity(condition) 26 27 #define QUICHE_CHROMIUM_LOG_INFO VLOG(1) 28 #define QUICHE_CHROMIUM_LOG_WARNING DLOG(WARNING) 29 #define QUICHE_CHROMIUM_LOG_ERROR DLOG(ERROR) 30 // TODO(pbos): Make QUICHE_LOG(FATAL) [[noreturn]] when quiche can build with 31 // -Wunreachable-code-aggressive if LOG(FATAL) is [[noreturn]] which will need 32 // to be resolved upstream 33 #define QUICHE_CHROMIUM_LOG_FATAL \ 34 LAZY_STREAM(LOG_STREAM(FATAL), \ 35 ::logging::ShouldCreateLogMessage(::logging::LOGGING_FATAL)) 36 #define QUICHE_CHROMIUM_LOG_DFATAL LOG(DFATAL) 37 38 #define QUICHE_CHROMIUM_DLOG_INFO DVLOG(1) 39 #define QUICHE_CHROMIUM_DLOG_WARNING DLOG(WARNING) 40 #define QUICHE_CHROMIUM_DLOG_ERROR DLOG(ERROR) 41 #define QUICHE_CHROMIUM_DLOG_FATAL DLOG(FATAL) 42 #define QUICHE_CHROMIUM_DLOG_DFATAL DLOG(DFATAL) 43 44 #define QUICHE_CHROMIUM_LOG_IF_INFO(condition) VLOG_IF(1, condition) 45 #define QUICHE_CHROMIUM_LOG_IF_WARNING(condition) DLOG_IF(WARNING, condition) 46 #define QUICHE_CHROMIUM_LOG_IF_ERROR(condition) DLOG_IF(ERROR, condition) 47 #define QUICHE_CHROMIUM_LOG_IF_FATAL(condition) LOG_IF(FATAL, condition) 48 #define QUICHE_CHROMIUM_LOG_IF_DFATAL(condition) LOG_IF(DFATAL, condition) 49 50 #define QUICHE_CHROMIUM_DLOG_IF_INFO(condition) DVLOG_IF(1, condition) 51 #define QUICHE_CHROMIUM_DLOG_IF_WARNING(condition) DLOG_IF(WARNING, condition) 52 #define QUICHE_CHROMIUM_DLOG_IF_ERROR(condition) DLOG_IF(ERROR, condition) 53 #define QUICHE_CHROMIUM_DLOG_IF_FATAL(condition) DLOG_IF(FATAL, condition) 54 #define QUICHE_CHROMIUM_DLOG_IF_DFATAL(condition) DLOG_IF(DFATAL, condition) 55 56 #define QUICHE_DVLOG_IMPL(verbose_level) DVLOG(verbose_level) 57 #define QUICHE_DVLOG_IF_IMPL(verbose_level, condition) \ 58 DVLOG_IF(verbose_level, condition) 59 60 #define QUICHE_LOG_INFO_IS_ON_IMPL() 0 61 #ifdef NDEBUG 62 #define QUICHE_LOG_WARNING_IS_ON_IMPL() 0 63 #define QUICHE_LOG_ERROR_IS_ON_IMPL() 0 64 #else 65 #define QUICHE_LOG_WARNING_IS_ON_IMPL() 1 66 #define QUICHE_LOG_ERROR_IS_ON_IMPL() 1 67 #endif 68 #define QUICHE_DLOG_INFO_IS_ON_IMPL() 0 69 70 #if BUILDFLAG(IS_WIN) 71 // wingdi.h defines ERROR to be 0. When we call QUICHE_DLOG(ERROR), it gets 72 // substituted with 0, and it expands to QUICHE_CHROMIUM_DLOG_0. To allow us to 73 // keep using this syntax, we define this macro to do the same thing as 74 // QUICHE_CHROMIUM_DLOG_ERROR. 75 #define QUICHE_CHROMIUM_LOG_0 QUICHE_CHROMIUM_LOG_ERROR 76 #define QUICHE_CHROMIUM_DLOG_0 QUICHE_CHROMIUM_DLOG_ERROR 77 #define QUICHE_CHROMIUM_LOG_IF_0 QUICHE_CHROMIUM_LOG_IF_ERROR 78 #define QUICHE_CHROMIUM_DLOG_IF_0 QUICHE_CHROMIUM_DLOG_IF_ERROR 79 #endif 80 81 #define QUICHE_NOTREACHED_IMPL() NOTREACHED() 82 83 #define QUICHE_PLOG_IMPL(severity) DVLOG(1) 84 85 #define QUICHE_CHECK_IMPL(condition) CHECK(condition) 86 #define QUICHE_CHECK_EQ_IMPL(val1, val2) CHECK_EQ(val1, val2) 87 #define QUICHE_CHECK_NE_IMPL(val1, val2) CHECK_NE(val1, val2) 88 #define QUICHE_CHECK_LE_IMPL(val1, val2) CHECK_LE(val1, val2) 89 #define QUICHE_CHECK_LT_IMPL(val1, val2) CHECK_LT(val1, val2) 90 #define QUICHE_CHECK_GE_IMPL(val1, val2) CHECK_GE(val1, val2) 91 #define QUICHE_CHECK_GT_IMPL(val1, val2) CHECK_GT(val1, val2) 92 #define QUICHE_CHECK_OK_IMPL(value) CHECK((value).ok()) 93 94 #define QUICHE_DCHECK_IMPL(condition) DCHECK(condition) 95 #define QUICHE_DCHECK_EQ_IMPL(val1, val2) DCHECK_EQ(val1, val2) 96 #define QUICHE_DCHECK_NE_IMPL(val1, val2) DCHECK_NE(val1, val2) 97 #define QUICHE_DCHECK_LE_IMPL(val1, val2) DCHECK_LE(val1, val2) 98 #define QUICHE_DCHECK_LT_IMPL(val1, val2) DCHECK_LT(val1, val2) 99 #define QUICHE_DCHECK_GE_IMPL(val1, val2) DCHECK_GE(val1, val2) 100 #define QUICHE_DCHECK_GT_IMPL(val1, val2) DCHECK_GT(val1, val2) 101 102 namespace quic { 103 template <typename T> 104 QUICHE_EXPORT inline std::ostream& operator<<(std::ostream& out, 105 const std::vector<T>& v) { 106 out << "["; 107 const char* sep = ""; 108 for (size_t i = 0; i < v.size(); ++i) { 109 out << sep << v[i]; 110 sep = ", "; 111 } 112 return out << "]"; 113 } 114 } // namespace quic 115 116 #endif // NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_LOGGING_IMPL_H_ 117