xref: /aosp_15_r20/external/abseil-cpp/absl/log/internal/log_message.h (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2022 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker //
15*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
16*9356374aSAndroid Build Coastguard Worker // File: log/internal/log_message.h
17*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
18*9356374aSAndroid Build Coastguard Worker //
19*9356374aSAndroid Build Coastguard Worker // This file declares `class absl::log_internal::LogMessage`. This class more or
20*9356374aSAndroid Build Coastguard Worker // less represents a particular log message. LOG/CHECK macros create a
21*9356374aSAndroid Build Coastguard Worker // temporary instance of `LogMessage` and then stream values to it.  At the end
22*9356374aSAndroid Build Coastguard Worker // of the LOG/CHECK statement, LogMessage instance goes out of scope and
23*9356374aSAndroid Build Coastguard Worker // `~LogMessage` directs the message to the registered log sinks.
24*9356374aSAndroid Build Coastguard Worker // Heap-allocation of `LogMessage` is unsupported.  Construction outside of a
25*9356374aSAndroid Build Coastguard Worker // `LOG` macro is unsupported.
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_LOG_INTERNAL_LOG_MESSAGE_H_
28*9356374aSAndroid Build Coastguard Worker #define ABSL_LOG_INTERNAL_LOG_MESSAGE_H_
29*9356374aSAndroid Build Coastguard Worker 
30*9356374aSAndroid Build Coastguard Worker #include <ios>
31*9356374aSAndroid Build Coastguard Worker #include <memory>
32*9356374aSAndroid Build Coastguard Worker #include <ostream>
33*9356374aSAndroid Build Coastguard Worker #include <streambuf>
34*9356374aSAndroid Build Coastguard Worker #include <string>
35*9356374aSAndroid Build Coastguard Worker 
36*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/errno_saver.h"
39*9356374aSAndroid Build Coastguard Worker #include "absl/base/log_severity.h"
40*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/nullguard.h"
41*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_entry.h"
42*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_sink.h"
43*9356374aSAndroid Build Coastguard Worker #include "absl/strings/has_absl_stringify.h"
44*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
45*9356374aSAndroid Build Coastguard Worker #include "absl/time/time.h"
46*9356374aSAndroid Build Coastguard Worker 
47*9356374aSAndroid Build Coastguard Worker namespace absl {
48*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
49*9356374aSAndroid Build Coastguard Worker namespace log_internal {
50*9356374aSAndroid Build Coastguard Worker constexpr int kLogMessageBufferSize = 15000;
51*9356374aSAndroid Build Coastguard Worker 
52*9356374aSAndroid Build Coastguard Worker class LogMessage {
53*9356374aSAndroid Build Coastguard Worker  public:
54*9356374aSAndroid Build Coastguard Worker   struct InfoTag {};
55*9356374aSAndroid Build Coastguard Worker   struct WarningTag {};
56*9356374aSAndroid Build Coastguard Worker   struct ErrorTag {};
57*9356374aSAndroid Build Coastguard Worker 
58*9356374aSAndroid Build Coastguard Worker   // Used for `LOG`.
59*9356374aSAndroid Build Coastguard Worker   LogMessage(const char* file, int line,
60*9356374aSAndroid Build Coastguard Worker              absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD;
61*9356374aSAndroid Build Coastguard Worker   // These constructors are slightly smaller/faster to call; the severity is
62*9356374aSAndroid Build Coastguard Worker   // curried into the function pointer.
63*9356374aSAndroid Build Coastguard Worker   LogMessage(const char* file, int line,
64*9356374aSAndroid Build Coastguard Worker              InfoTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
65*9356374aSAndroid Build Coastguard Worker   LogMessage(const char* file, int line,
66*9356374aSAndroid Build Coastguard Worker              WarningTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
67*9356374aSAndroid Build Coastguard Worker   LogMessage(const char* file, int line,
68*9356374aSAndroid Build Coastguard Worker              ErrorTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
69*9356374aSAndroid Build Coastguard Worker   LogMessage(const LogMessage&) = delete;
70*9356374aSAndroid Build Coastguard Worker   LogMessage& operator=(const LogMessage&) = delete;
71*9356374aSAndroid Build Coastguard Worker   ~LogMessage() ABSL_ATTRIBUTE_COLD;
72*9356374aSAndroid Build Coastguard Worker 
73*9356374aSAndroid Build Coastguard Worker   // Overrides the location inferred from the callsite.  The string pointed to
74*9356374aSAndroid Build Coastguard Worker   // by `file` must be valid until the end of the statement.
75*9356374aSAndroid Build Coastguard Worker   LogMessage& AtLocation(absl::string_view file, int line);
76*9356374aSAndroid Build Coastguard Worker   // Omits the prefix from this line.  The prefix includes metadata about the
77*9356374aSAndroid Build Coastguard Worker   // logged data such as source code location and timestamp.
78*9356374aSAndroid Build Coastguard Worker   LogMessage& NoPrefix();
79*9356374aSAndroid Build Coastguard Worker   // Sets the verbosity field of the logged message as if it was logged by
80*9356374aSAndroid Build Coastguard Worker   // `VLOG(verbose_level)`.  Unlike `VLOG`, this method does not affect
81*9356374aSAndroid Build Coastguard Worker   // evaluation of the statement when the specified `verbose_level` has been
82*9356374aSAndroid Build Coastguard Worker   // disabled.  The only effect is on `absl::LogSink` implementations which
83*9356374aSAndroid Build Coastguard Worker   // make use of the `absl::LogSink::verbosity()` value.  The value
84*9356374aSAndroid Build Coastguard Worker   // `absl::LogEntry::kNoVerbosityLevel` can be specified to mark the message
85*9356374aSAndroid Build Coastguard Worker   // not verbose.
86*9356374aSAndroid Build Coastguard Worker   LogMessage& WithVerbosity(int verbose_level);
87*9356374aSAndroid Build Coastguard Worker   // Uses the specified timestamp instead of one collected in the constructor.
88*9356374aSAndroid Build Coastguard Worker   LogMessage& WithTimestamp(absl::Time timestamp);
89*9356374aSAndroid Build Coastguard Worker   // Uses the specified thread ID instead of one collected in the constructor.
90*9356374aSAndroid Build Coastguard Worker   LogMessage& WithThreadID(absl::LogEntry::tid_t tid);
91*9356374aSAndroid Build Coastguard Worker   // Copies all metadata (but no data) from the specified `absl::LogEntry`.
92*9356374aSAndroid Build Coastguard Worker   LogMessage& WithMetadataFrom(const absl::LogEntry& entry);
93*9356374aSAndroid Build Coastguard Worker   // Appends to the logged message a colon, a space, a textual description of
94*9356374aSAndroid Build Coastguard Worker   // the current value of `errno` (as by strerror(3)), and the numerical value
95*9356374aSAndroid Build Coastguard Worker   // of `errno`.
96*9356374aSAndroid Build Coastguard Worker   LogMessage& WithPerror();
97*9356374aSAndroid Build Coastguard Worker   // Sends this message to `*sink` in addition to whatever other sinks it would
98*9356374aSAndroid Build Coastguard Worker   // otherwise have been sent to.  `sink` must not be null.
99*9356374aSAndroid Build Coastguard Worker   LogMessage& ToSinkAlso(absl::LogSink* sink);
100*9356374aSAndroid Build Coastguard Worker   // Sends this message to `*sink` and no others.  `sink` must not be null.
101*9356374aSAndroid Build Coastguard Worker   LogMessage& ToSinkOnly(absl::LogSink* sink);
102*9356374aSAndroid Build Coastguard Worker 
103*9356374aSAndroid Build Coastguard Worker   // Don't call this method from outside this library.
InternalStream()104*9356374aSAndroid Build Coastguard Worker   LogMessage& InternalStream() { return *this; }
105*9356374aSAndroid Build Coastguard Worker 
106*9356374aSAndroid Build Coastguard Worker   // By-value overloads for small, common types let us overlook common failures
107*9356374aSAndroid Build Coastguard Worker   // to define globals and static data members (i.e. in a .cc file).
108*9356374aSAndroid Build Coastguard Worker   // clang-format off
109*9356374aSAndroid Build Coastguard Worker   // The CUDA toolchain cannot handle these <<<'s:
110*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(char v) { return operator<< <char>(v); }
111*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(signed char v) { return operator<< <signed char>(v); }
112*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(unsigned char v) {
113*9356374aSAndroid Build Coastguard Worker     return operator<< <unsigned char>(v);
114*9356374aSAndroid Build Coastguard Worker   }
115*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(signed short v) {  // NOLINT
116*9356374aSAndroid Build Coastguard Worker     return operator<< <signed short>(v);  // NOLINT
117*9356374aSAndroid Build Coastguard Worker   }
118*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(signed int v) { return operator<< <signed int>(v); }
119*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(signed long v) {  // NOLINT
120*9356374aSAndroid Build Coastguard Worker     return operator<< <signed long>(v);  // NOLINT
121*9356374aSAndroid Build Coastguard Worker   }
122*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(signed long long v) {  // NOLINT
123*9356374aSAndroid Build Coastguard Worker     return operator<< <signed long long>(v);  // NOLINT
124*9356374aSAndroid Build Coastguard Worker   }
125*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(unsigned short v) {  // NOLINT
126*9356374aSAndroid Build Coastguard Worker     return operator<< <unsigned short>(v);  // NOLINT
127*9356374aSAndroid Build Coastguard Worker   }
128*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(unsigned int v) {
129*9356374aSAndroid Build Coastguard Worker     return operator<< <unsigned int>(v);
130*9356374aSAndroid Build Coastguard Worker   }
131*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(unsigned long v) {  // NOLINT
132*9356374aSAndroid Build Coastguard Worker     return operator<< <unsigned long>(v);  // NOLINT
133*9356374aSAndroid Build Coastguard Worker   }
134*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(unsigned long long v) {  // NOLINT
135*9356374aSAndroid Build Coastguard Worker     return operator<< <unsigned long long>(v);  // NOLINT
136*9356374aSAndroid Build Coastguard Worker   }
137*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(void* v) { return operator<< <void*>(v); }
138*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(const void* v) { return operator<< <const void*>(v); }
139*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(float v) { return operator<< <float>(v); }
140*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(double v) { return operator<< <double>(v); }
141*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(bool v) { return operator<< <bool>(v); }
142*9356374aSAndroid Build Coastguard Worker   // clang-format on
143*9356374aSAndroid Build Coastguard Worker 
144*9356374aSAndroid Build Coastguard Worker   // These overloads are more efficient since no `ostream` is involved.
145*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(const std::string& v);
146*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(absl::string_view v);
147*9356374aSAndroid Build Coastguard Worker 
148*9356374aSAndroid Build Coastguard Worker   // Handle stream manipulators e.g. std::endl.
149*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(std::ostream& (*m)(std::ostream& os));
150*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(std::ios_base& (*m)(std::ios_base& os));
151*9356374aSAndroid Build Coastguard Worker 
152*9356374aSAndroid Build Coastguard Worker   // Literal strings.  This allows us to record C string literals as literals in
153*9356374aSAndroid Build Coastguard Worker   // the logging.proto.Value.
154*9356374aSAndroid Build Coastguard Worker   //
155*9356374aSAndroid Build Coastguard Worker   // Allow this overload to be inlined to prevent generating instantiations of
156*9356374aSAndroid Build Coastguard Worker   // this template for every value of `SIZE` encountered in each source code
157*9356374aSAndroid Build Coastguard Worker   // file. That significantly increases linker input sizes. Inlining is cheap
158*9356374aSAndroid Build Coastguard Worker   // because the argument to this overload is almost always a string literal so
159*9356374aSAndroid Build Coastguard Worker   // the call to `strlen` can be replaced at compile time. The overload for
160*9356374aSAndroid Build Coastguard Worker   // `char[]` below should not be inlined. The compiler typically does not have
161*9356374aSAndroid Build Coastguard Worker   // the string at compile time and cannot replace the call to `strlen` so
162*9356374aSAndroid Build Coastguard Worker   // inlining it increases the binary size. See the discussion on
163*9356374aSAndroid Build Coastguard Worker   // cl/107527369.
164*9356374aSAndroid Build Coastguard Worker   template <int SIZE>
165*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(const char (&buf)[SIZE]);
166*9356374aSAndroid Build Coastguard Worker 
167*9356374aSAndroid Build Coastguard Worker   // This prevents non-const `char[]` arrays from looking like literals.
168*9356374aSAndroid Build Coastguard Worker   template <int SIZE>
169*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(char (&buf)[SIZE]) ABSL_ATTRIBUTE_NOINLINE;
170*9356374aSAndroid Build Coastguard Worker 
171*9356374aSAndroid Build Coastguard Worker   // Types that support `AbslStringify()` are serialized that way.
172*9356374aSAndroid Build Coastguard Worker   template <typename T,
173*9356374aSAndroid Build Coastguard Worker             typename std::enable_if<absl::HasAbslStringify<T>::value,
174*9356374aSAndroid Build Coastguard Worker                                     int>::type = 0>
175*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(const T& v) ABSL_ATTRIBUTE_NOINLINE;
176*9356374aSAndroid Build Coastguard Worker 
177*9356374aSAndroid Build Coastguard Worker   // Types that don't support `AbslStringify()` but do support streaming into a
178*9356374aSAndroid Build Coastguard Worker   // `std::ostream&` are serialized that way.
179*9356374aSAndroid Build Coastguard Worker   template <typename T,
180*9356374aSAndroid Build Coastguard Worker             typename std::enable_if<!absl::HasAbslStringify<T>::value,
181*9356374aSAndroid Build Coastguard Worker                                     int>::type = 0>
182*9356374aSAndroid Build Coastguard Worker   LogMessage& operator<<(const T& v) ABSL_ATTRIBUTE_NOINLINE;
183*9356374aSAndroid Build Coastguard Worker 
184*9356374aSAndroid Build Coastguard Worker   // Note: We explicitly do not support `operator<<` for non-const references
185*9356374aSAndroid Build Coastguard Worker   // because it breaks logging of non-integer bitfield types (i.e., enums).
186*9356374aSAndroid Build Coastguard Worker 
187*9356374aSAndroid Build Coastguard Worker  protected:
188*9356374aSAndroid Build Coastguard Worker   // Call `abort()` or similar to perform `LOG(FATAL)` crash.  It is assumed
189*9356374aSAndroid Build Coastguard Worker   // that the caller has already generated and written the trace as appropriate.
190*9356374aSAndroid Build Coastguard Worker   [[noreturn]] static void FailWithoutStackTrace();
191*9356374aSAndroid Build Coastguard Worker 
192*9356374aSAndroid Build Coastguard Worker   // Similar to `FailWithoutStackTrace()`, but without `abort()`.  Terminates
193*9356374aSAndroid Build Coastguard Worker   // the process with an error exit code.
194*9356374aSAndroid Build Coastguard Worker   [[noreturn]] static void FailQuietly();
195*9356374aSAndroid Build Coastguard Worker 
196*9356374aSAndroid Build Coastguard Worker   // Dispatches the completed `absl::LogEntry` to applicable `absl::LogSink`s.
197*9356374aSAndroid Build Coastguard Worker   // This might as well be inlined into `~LogMessage` except that
198*9356374aSAndroid Build Coastguard Worker   // `~LogMessageFatal` needs to call it early.
199*9356374aSAndroid Build Coastguard Worker   void Flush();
200*9356374aSAndroid Build Coastguard Worker 
201*9356374aSAndroid Build Coastguard Worker   // After this is called, failures are done as quiet as possible for this log
202*9356374aSAndroid Build Coastguard Worker   // message.
203*9356374aSAndroid Build Coastguard Worker   void SetFailQuietly();
204*9356374aSAndroid Build Coastguard Worker 
205*9356374aSAndroid Build Coastguard Worker  private:
206*9356374aSAndroid Build Coastguard Worker   struct LogMessageData;  // Opaque type containing message state
207*9356374aSAndroid Build Coastguard Worker   friend class AsLiteralImpl;
208*9356374aSAndroid Build Coastguard Worker   friend class StringifySink;
209*9356374aSAndroid Build Coastguard Worker 
210*9356374aSAndroid Build Coastguard Worker   // This streambuf writes directly into the structured logging buffer so that
211*9356374aSAndroid Build Coastguard Worker   // arbitrary types can be encoded as string data (using
212*9356374aSAndroid Build Coastguard Worker   // `operator<<(std::ostream &, ...)` without any extra allocation or copying.
213*9356374aSAndroid Build Coastguard Worker   // Space is reserved before the data to store the length field, which is
214*9356374aSAndroid Build Coastguard Worker   // filled in by `~OstreamView`.
215*9356374aSAndroid Build Coastguard Worker   class OstreamView final : public std::streambuf {
216*9356374aSAndroid Build Coastguard Worker    public:
217*9356374aSAndroid Build Coastguard Worker     explicit OstreamView(LogMessageData& message_data);
218*9356374aSAndroid Build Coastguard Worker     ~OstreamView() override;
219*9356374aSAndroid Build Coastguard Worker     OstreamView(const OstreamView&) = delete;
220*9356374aSAndroid Build Coastguard Worker     OstreamView& operator=(const OstreamView&) = delete;
221*9356374aSAndroid Build Coastguard Worker     std::ostream& stream();
222*9356374aSAndroid Build Coastguard Worker 
223*9356374aSAndroid Build Coastguard Worker    private:
224*9356374aSAndroid Build Coastguard Worker     LogMessageData& data_;
225*9356374aSAndroid Build Coastguard Worker     absl::Span<char> encoded_remaining_copy_;
226*9356374aSAndroid Build Coastguard Worker     absl::Span<char> message_start_;
227*9356374aSAndroid Build Coastguard Worker     absl::Span<char> string_start_;
228*9356374aSAndroid Build Coastguard Worker   };
229*9356374aSAndroid Build Coastguard Worker 
230*9356374aSAndroid Build Coastguard Worker   enum class StringType {
231*9356374aSAndroid Build Coastguard Worker     kLiteral,
232*9356374aSAndroid Build Coastguard Worker     kNotLiteral,
233*9356374aSAndroid Build Coastguard Worker   };
234*9356374aSAndroid Build Coastguard Worker   template <StringType str_type>
235*9356374aSAndroid Build Coastguard Worker   void CopyToEncodedBuffer(absl::string_view str) ABSL_ATTRIBUTE_NOINLINE;
236*9356374aSAndroid Build Coastguard Worker   template <StringType str_type>
237*9356374aSAndroid Build Coastguard Worker   void CopyToEncodedBuffer(char ch, size_t num) ABSL_ATTRIBUTE_NOINLINE;
238*9356374aSAndroid Build Coastguard Worker 
239*9356374aSAndroid Build Coastguard Worker   // Returns `true` if the message is fatal or enabled debug-fatal.
240*9356374aSAndroid Build Coastguard Worker   bool IsFatal() const;
241*9356374aSAndroid Build Coastguard Worker 
242*9356374aSAndroid Build Coastguard Worker   // Records some tombstone-type data in anticipation of `Die`.
243*9356374aSAndroid Build Coastguard Worker   void PrepareToDie();
244*9356374aSAndroid Build Coastguard Worker   void Die();
245*9356374aSAndroid Build Coastguard Worker 
246*9356374aSAndroid Build Coastguard Worker   void SendToLog();
247*9356374aSAndroid Build Coastguard Worker 
248*9356374aSAndroid Build Coastguard Worker   // Checks `FLAGS_log_backtrace_at` and appends a backtrace if appropriate.
249*9356374aSAndroid Build Coastguard Worker   void LogBacktraceIfNeeded();
250*9356374aSAndroid Build Coastguard Worker 
251*9356374aSAndroid Build Coastguard Worker   // This should be the first data member so that its initializer captures errno
252*9356374aSAndroid Build Coastguard Worker   // before any other initializers alter it (e.g. with calls to new) and so that
253*9356374aSAndroid Build Coastguard Worker   // no other destructors run afterward an alter it (e.g. with calls to delete).
254*9356374aSAndroid Build Coastguard Worker   absl::base_internal::ErrnoSaver errno_saver_;
255*9356374aSAndroid Build Coastguard Worker 
256*9356374aSAndroid Build Coastguard Worker   // We keep the data in a separate struct so that each instance of `LogMessage`
257*9356374aSAndroid Build Coastguard Worker   // uses less stack space.
258*9356374aSAndroid Build Coastguard Worker   std::unique_ptr<LogMessageData> data_;
259*9356374aSAndroid Build Coastguard Worker };
260*9356374aSAndroid Build Coastguard Worker 
261*9356374aSAndroid Build Coastguard Worker // Helper class so that `AbslStringify()` can modify the LogMessage.
262*9356374aSAndroid Build Coastguard Worker class StringifySink final {
263*9356374aSAndroid Build Coastguard Worker  public:
StringifySink(LogMessage & message)264*9356374aSAndroid Build Coastguard Worker   explicit StringifySink(LogMessage& message) : message_(message) {}
265*9356374aSAndroid Build Coastguard Worker 
Append(size_t count,char ch)266*9356374aSAndroid Build Coastguard Worker   void Append(size_t count, char ch) {
267*9356374aSAndroid Build Coastguard Worker     message_.CopyToEncodedBuffer<LogMessage::StringType::kNotLiteral>(ch,
268*9356374aSAndroid Build Coastguard Worker                                                                       count);
269*9356374aSAndroid Build Coastguard Worker   }
270*9356374aSAndroid Build Coastguard Worker 
Append(absl::string_view v)271*9356374aSAndroid Build Coastguard Worker   void Append(absl::string_view v) {
272*9356374aSAndroid Build Coastguard Worker     message_.CopyToEncodedBuffer<LogMessage::StringType::kNotLiteral>(v);
273*9356374aSAndroid Build Coastguard Worker   }
274*9356374aSAndroid Build Coastguard Worker 
275*9356374aSAndroid Build Coastguard Worker   // For types that implement `AbslStringify` using `absl::Format()`.
AbslFormatFlush(StringifySink * sink,absl::string_view v)276*9356374aSAndroid Build Coastguard Worker   friend void AbslFormatFlush(StringifySink* sink, absl::string_view v) {
277*9356374aSAndroid Build Coastguard Worker     sink->Append(v);
278*9356374aSAndroid Build Coastguard Worker   }
279*9356374aSAndroid Build Coastguard Worker 
280*9356374aSAndroid Build Coastguard Worker  private:
281*9356374aSAndroid Build Coastguard Worker   LogMessage& message_;
282*9356374aSAndroid Build Coastguard Worker };
283*9356374aSAndroid Build Coastguard Worker 
284*9356374aSAndroid Build Coastguard Worker // Note: the following is declared `ABSL_ATTRIBUTE_NOINLINE`
285*9356374aSAndroid Build Coastguard Worker template <typename T,
286*9356374aSAndroid Build Coastguard Worker           typename std::enable_if<absl::HasAbslStringify<T>::value, int>::type>
287*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(const T& v) {
288*9356374aSAndroid Build Coastguard Worker   StringifySink sink(*this);
289*9356374aSAndroid Build Coastguard Worker   // Replace with public API.
290*9356374aSAndroid Build Coastguard Worker   AbslStringify(sink, v);
291*9356374aSAndroid Build Coastguard Worker   return *this;
292*9356374aSAndroid Build Coastguard Worker }
293*9356374aSAndroid Build Coastguard Worker 
294*9356374aSAndroid Build Coastguard Worker // Note: the following is declared `ABSL_ATTRIBUTE_NOINLINE`
295*9356374aSAndroid Build Coastguard Worker template <typename T,
296*9356374aSAndroid Build Coastguard Worker           typename std::enable_if<!absl::HasAbslStringify<T>::value, int>::type>
297*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(const T& v) {
298*9356374aSAndroid Build Coastguard Worker   OstreamView view(*data_);
299*9356374aSAndroid Build Coastguard Worker   view.stream() << log_internal::NullGuard<T>().Guard(v);
300*9356374aSAndroid Build Coastguard Worker   return *this;
301*9356374aSAndroid Build Coastguard Worker }
302*9356374aSAndroid Build Coastguard Worker 
303*9356374aSAndroid Build Coastguard Worker template <int SIZE>
304*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(const char (&buf)[SIZE]) {
305*9356374aSAndroid Build Coastguard Worker   CopyToEncodedBuffer<StringType::kLiteral>(buf);
306*9356374aSAndroid Build Coastguard Worker   return *this;
307*9356374aSAndroid Build Coastguard Worker }
308*9356374aSAndroid Build Coastguard Worker 
309*9356374aSAndroid Build Coastguard Worker // Note: the following is declared `ABSL_ATTRIBUTE_NOINLINE`
310*9356374aSAndroid Build Coastguard Worker template <int SIZE>
311*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(char (&buf)[SIZE]) {
312*9356374aSAndroid Build Coastguard Worker   CopyToEncodedBuffer<StringType::kNotLiteral>(buf);
313*9356374aSAndroid Build Coastguard Worker   return *this;
314*9356374aSAndroid Build Coastguard Worker }
315*9356374aSAndroid Build Coastguard Worker // We instantiate these specializations in the library's TU to save space in
316*9356374aSAndroid Build Coastguard Worker // other TUs.  Since the template is marked `ABSL_ATTRIBUTE_NOINLINE` we will be
317*9356374aSAndroid Build Coastguard Worker // emitting a function call either way.
318*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const char& v);
319*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const signed char& v);
320*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const unsigned char& v);
321*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const short& v);  // NOLINT
322*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(
323*9356374aSAndroid Build Coastguard Worker     const unsigned short& v);  // NOLINT
324*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const int& v);
325*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(
326*9356374aSAndroid Build Coastguard Worker     const unsigned int& v);                                         // NOLINT
327*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const long& v);  // NOLINT
328*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(
329*9356374aSAndroid Build Coastguard Worker     const unsigned long& v);  // NOLINT
330*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(
331*9356374aSAndroid Build Coastguard Worker     const long long& v);  // NOLINT
332*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(
333*9356374aSAndroid Build Coastguard Worker     const unsigned long long& v);  // NOLINT
334*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(void* const& v);
335*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const void* const& v);
336*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const float& v);
337*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const double& v);
338*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const bool& v);
339*9356374aSAndroid Build Coastguard Worker 
340*9356374aSAndroid Build Coastguard Worker extern template void LogMessage::CopyToEncodedBuffer<
341*9356374aSAndroid Build Coastguard Worker     LogMessage::StringType::kLiteral>(absl::string_view str);
342*9356374aSAndroid Build Coastguard Worker extern template void LogMessage::CopyToEncodedBuffer<
343*9356374aSAndroid Build Coastguard Worker     LogMessage::StringType::kNotLiteral>(absl::string_view str);
344*9356374aSAndroid Build Coastguard Worker extern template void
345*9356374aSAndroid Build Coastguard Worker LogMessage::CopyToEncodedBuffer<LogMessage::StringType::kLiteral>(char ch,
346*9356374aSAndroid Build Coastguard Worker                                                                   size_t num);
347*9356374aSAndroid Build Coastguard Worker extern template void LogMessage::CopyToEncodedBuffer<
348*9356374aSAndroid Build Coastguard Worker     LogMessage::StringType::kNotLiteral>(char ch, size_t num);
349*9356374aSAndroid Build Coastguard Worker 
350*9356374aSAndroid Build Coastguard Worker // `LogMessageFatal` ensures the process will exit in failure after logging this
351*9356374aSAndroid Build Coastguard Worker // message.
352*9356374aSAndroid Build Coastguard Worker class LogMessageFatal final : public LogMessage {
353*9356374aSAndroid Build Coastguard Worker  public:
354*9356374aSAndroid Build Coastguard Worker   LogMessageFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD;
355*9356374aSAndroid Build Coastguard Worker   LogMessageFatal(const char* file, int line,
356*9356374aSAndroid Build Coastguard Worker                   absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD;
357*9356374aSAndroid Build Coastguard Worker   [[noreturn]] ~LogMessageFatal();
358*9356374aSAndroid Build Coastguard Worker };
359*9356374aSAndroid Build Coastguard Worker 
360*9356374aSAndroid Build Coastguard Worker // `LogMessageDebugFatal` ensures the process will exit in failure after logging
361*9356374aSAndroid Build Coastguard Worker // this message. It matches LogMessageFatal but is not [[noreturn]] as it's used
362*9356374aSAndroid Build Coastguard Worker // for DLOG(FATAL) variants.
363*9356374aSAndroid Build Coastguard Worker class LogMessageDebugFatal final : public LogMessage {
364*9356374aSAndroid Build Coastguard Worker  public:
365*9356374aSAndroid Build Coastguard Worker   LogMessageDebugFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD;
366*9356374aSAndroid Build Coastguard Worker   ~LogMessageDebugFatal();
367*9356374aSAndroid Build Coastguard Worker };
368*9356374aSAndroid Build Coastguard Worker 
369*9356374aSAndroid Build Coastguard Worker class LogMessageQuietlyDebugFatal final : public LogMessage {
370*9356374aSAndroid Build Coastguard Worker  public:
371*9356374aSAndroid Build Coastguard Worker   // DLOG(QFATAL) calls this instead of LogMessageQuietlyFatal to make sure the
372*9356374aSAndroid Build Coastguard Worker   // destructor is not [[noreturn]] even if this is always FATAL as this is only
373*9356374aSAndroid Build Coastguard Worker   // invoked when DLOG() is enabled.
374*9356374aSAndroid Build Coastguard Worker   LogMessageQuietlyDebugFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD;
375*9356374aSAndroid Build Coastguard Worker   ~LogMessageQuietlyDebugFatal();
376*9356374aSAndroid Build Coastguard Worker };
377*9356374aSAndroid Build Coastguard Worker 
378*9356374aSAndroid Build Coastguard Worker // Used for LOG(QFATAL) to make sure it's properly understood as [[noreturn]].
379*9356374aSAndroid Build Coastguard Worker class LogMessageQuietlyFatal final : public LogMessage {
380*9356374aSAndroid Build Coastguard Worker  public:
381*9356374aSAndroid Build Coastguard Worker   LogMessageQuietlyFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD;
382*9356374aSAndroid Build Coastguard Worker   LogMessageQuietlyFatal(const char* file, int line,
383*9356374aSAndroid Build Coastguard Worker                          absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD;
384*9356374aSAndroid Build Coastguard Worker   [[noreturn]] ~LogMessageQuietlyFatal();
385*9356374aSAndroid Build Coastguard Worker };
386*9356374aSAndroid Build Coastguard Worker 
387*9356374aSAndroid Build Coastguard Worker }  // namespace log_internal
388*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
389*9356374aSAndroid Build Coastguard Worker }  // namespace absl
390*9356374aSAndroid Build Coastguard Worker 
391*9356374aSAndroid Build Coastguard Worker extern "C" ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(
392*9356374aSAndroid Build Coastguard Worker     AbslInternalOnFatalLogMessage)(const absl::LogEntry&);
393*9356374aSAndroid Build Coastguard Worker 
394*9356374aSAndroid Build Coastguard Worker #endif  // ABSL_LOG_INTERNAL_LOG_MESSAGE_H_
395