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