diff options
author | Andy Getzendanner <durandal@google.com> | 2022-11-28 15:14:27 -0800 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2022-11-28 15:15:24 -0800 |
commit | 13708db87b1ab69f4f2b3214f3f51e986546f282 (patch) | |
tree | 9fc8df2738e52ed2f1b23d5438bccfba80114957 | |
parent | 558a0e466c6328b835eeba81e77f2a88a6a90f3c (diff) | |
download | abseil-13708db87b1ab69f4f2b3214f3f51e986546f282.tar.gz abseil-13708db87b1ab69f4f2b3214f3f51e986546f282.tar.bz2 abseil-13708db87b1ab69f4f2b3214f3f51e986546f282.zip |
Write (more) directly into the structured buffer from StringifySink, including for (size_t, char) overload.
PiperOrigin-RevId: 491456410
Change-Id: I76dec24b0bd02204fa38419af9247cee38b1cf50
-rw-r--r-- | absl/log/check_test.cc | 2 | ||||
-rw-r--r-- | absl/log/internal/append_truncated.h | 7 | ||||
-rw-r--r-- | absl/log/internal/log_message.cc | 21 | ||||
-rw-r--r-- | absl/log/internal/log_message.h | 14 |
4 files changed, 39 insertions, 5 deletions
diff --git a/absl/log/check_test.cc b/absl/log/check_test.cc index 4ce9d872..755adb3a 100644 --- a/absl/log/check_test.cc +++ b/absl/log/check_test.cc @@ -93,7 +93,7 @@ TEST(CHECKTest, TestBoolConvertible) { #if GTEST_HAS_DEATH_TEST -TEST(CHECKDeathTest, TestChecksWithSideeffects) { +TEST(CHECKDeathTest, TestChecksWithSideEffects) { int var = 0; CHECK([&var]() { ++var; diff --git a/absl/log/internal/append_truncated.h b/absl/log/internal/append_truncated.h index 096b7517..f0e7912c 100644 --- a/absl/log/internal/append_truncated.h +++ b/absl/log/internal/append_truncated.h @@ -33,6 +33,13 @@ inline size_t AppendTruncated(absl::string_view src, absl::Span<char> &dst) { dst.remove_prefix(src.size()); return src.size(); } +// Likewise, but `n` copies of `c`. +inline size_t AppendTruncated(char c, size_t n, absl::Span<char> &dst) { + if (n > dst.size()) n = dst.size(); + memset(dst.data(), c, n); + dst.remove_prefix(n); + return n; +} } // namespace log_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/absl/log/internal/log_message.cc b/absl/log/internal/log_message.cc index 6b4804f1..a8080610 100644 --- a/absl/log/internal/log_message.cc +++ b/absl/log/internal/log_message.cc @@ -540,6 +540,27 @@ void LogMessage::CopyToEncodedBuffer(absl::string_view str, data_->encoded_remaining.remove_suffix(data_->encoded_remaining.size()); } } +void LogMessage::CopyToEncodedBuffer(char ch, size_t num, StringType str_type) { + auto encoded_remaining_copy = data_->encoded_remaining; + auto value_start = EncodeMessageStart( + EventTag::kValue, BufferSizeFor(WireType::kLengthDelimited) + num, + &encoded_remaining_copy); + auto str_start = EncodeMessageStart(str_type == StringType::kLiteral + ? ValueTag::kStringLiteral + : ValueTag::kString, + num, &encoded_remaining_copy); + if (str_start.data()) { + // The field headers fit. + log_internal::AppendTruncated(ch, num, encoded_remaining_copy); + EncodeMessageLength(str_start, &encoded_remaining_copy); + EncodeMessageLength(value_start, &encoded_remaining_copy); + data_->encoded_remaining = encoded_remaining_copy; + } else { + // The field header(s) did not fit; zero `encoded_remaining` so we don't + // write anything else later. + data_->encoded_remaining.remove_suffix(data_->encoded_remaining.size()); + } +} LogMessageFatal::LogMessageFatal(const char* file, int line) : LogMessage(file, line, absl::LogSeverity::kFatal) {} diff --git a/absl/log/internal/log_message.h b/absl/log/internal/log_message.h index 7302dde0..3744276b 100644 --- a/absl/log/internal/log_message.h +++ b/absl/log/internal/log_message.h @@ -47,8 +47,6 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace log_internal { -class AsLiteralImpl; - constexpr int kLogMessageBufferSize = 15000; class LogMessage { @@ -195,6 +193,7 @@ class LogMessage { private: struct LogMessageData; // Opaque type containing message state friend class AsLiteralImpl; + friend class StringifySink; // This streambuf writes directly into the structured logging buffer so that // arbitrary types can be encoded as string data (using @@ -222,6 +221,8 @@ class LogMessage { }; void CopyToEncodedBuffer(absl::string_view str, StringType str_type) ABSL_ATTRIBUTE_NOINLINE; + void CopyToEncodedBuffer(char ch, size_t num, + StringType str_type) ABSL_ATTRIBUTE_NOINLINE; // Returns `true` if the message is fatal or enabled debug-fatal. bool IsFatal() const; @@ -250,9 +251,14 @@ class StringifySink final { public: explicit StringifySink(LogMessage& message) : message_(message) {} - void Append(size_t count, char ch) { message_ << std::string(count, ch); } + void Append(size_t count, char ch) { + message_.CopyToEncodedBuffer(ch, count, + LogMessage::StringType::kNotLiteral); + } - void Append(absl::string_view v) { message_ << v; } + void Append(absl::string_view v) { + message_.CopyToEncodedBuffer(v, LogMessage::StringType::kNotLiteral); + } // For types that implement `AbslStringify` using `absl::Format()`. friend void AbslFormatFlush(StringifySink* sink, absl::string_view v) { |