summaryrefslogtreecommitdiff
path: root/absl/strings
diff options
context:
space:
mode:
authorGravatar Abseil Team <absl-team@google.com>2021-02-01 14:09:21 -0800
committerGravatar Gennadiy Rozental <rogeeff@google.com>2021-02-02 05:36:53 -0500
commit20869f89edbc38139f46bdc49c8b6c3a1f7bee4c (patch)
treea8ee769172aba7c03f1ad6dc3d5b4ddc3a75eefc /absl/strings
parent184d2f8364bcb05e413ec4c72cad0cf86e712d1c (diff)
Export of internal Abseil changes
-- cea62ebc5d31c62aabcb94c066d9be506f34baf6 by Abseil Team <absl-team@google.com>: Fix typo in `Cord::EndsWith()` docs PiperOrigin-RevId: 355023067 -- f89225a55476478ec167be50dea543f5414836f9 by Abseil Team <absl-team@google.com>: Add set_cordz_info() and get_cordz_info() methods to InlineData This change has preparations for future (optional) integration of CordzInfo sampling data into Cord's InlineData for non inlined cords. PiperOrigin-RevId: 354965340 -- 324057574aeb697bd3327cb905eb5bca16ade768 by Abseil Team <absl-team@google.com>: Fix two comment typos. PiperOrigin-RevId: 354952568 -- 5bb93ca3d57ead3633e1efde4aa28718987ef64f by CJ Johnson <johnsoncj@google.com>: Clarify doc comment for absl::Cleanup by using absl::Status return type and clarify the engaged state by surfacing the initial value in the public header. PiperOrigin-RevId: 354935253 -- ec95424594b24a1aec9bf7972b2355f37285506a by Abseil Team <absl-team@google.com>: Remove `preserve_most` attribute from CordRep::Destroy() PiperOrigin-RevId: 354921927 GitOrigin-RevId: cea62ebc5d31c62aabcb94c066d9be506f34baf6 Change-Id: Ibe1d66197db7ce9554594e07b1c6e7c6dea3c9da
Diffstat (limited to 'absl/strings')
-rw-r--r--absl/strings/BUILD.bazel1
-rw-r--r--absl/strings/cord.h2
-rw-r--r--absl/strings/internal/cord_internal.h44
3 files changed, 26 insertions, 21 deletions
diff --git a/absl/strings/BUILD.bazel b/absl/strings/BUILD.bazel
index 794cf43a..5efaf896 100644
--- a/absl/strings/BUILD.bazel
+++ b/absl/strings/BUILD.bazel
@@ -286,6 +286,7 @@ cc_library(
"//absl/base:base_internal",
"//absl/base:config",
"//absl/base:core_headers",
+ "//absl/base:endian",
"//absl/base:raw_logging_internal",
"//absl/base:throw_delegate",
"//absl/container:compressed_tuple",
diff --git a/absl/strings/cord.h b/absl/strings/cord.h
index 17341bda..aefb5e53 100644
--- a/absl/strings/cord.h
+++ b/absl/strings/cord.h
@@ -289,7 +289,7 @@ class Cord {
bool StartsWith(const Cord& rhs) const;
bool StartsWith(absl::string_view rhs) const;
- // Cord::EndsWidth()
+ // Cord::EndsWith()
//
// Determines whether the Cord ends with the passed string data `rhs`.
bool EndsWith(absl::string_view rhs) const;
diff --git a/absl/strings/internal/cord_internal.h b/absl/strings/internal/cord_internal.h
index 96502433..cda00a44 100644
--- a/absl/strings/internal/cord_internal.h
+++ b/absl/strings/internal/cord_internal.h
@@ -22,6 +22,7 @@
#include <type_traits>
#include "absl/base/config.h"
+#include "absl/base/internal/endian.h"
#include "absl/base/internal/invoke.h"
#include "absl/base/optimization.h"
#include "absl/container/internal/compressed_tuple.h"
@@ -32,6 +33,8 @@ namespace absl {
ABSL_NAMESPACE_BEGIN
namespace cord_internal {
+class CordzInfo;
+
// Default feature enable states for cord ring buffers
enum CordFeatureDefaults {
kCordEnableRingBufferDefault = false,
@@ -193,26 +196,7 @@ struct CordRep {
// --------------------------------------------------------------------
// Memory management
- // This internal routine is called from the cold path of Unref below. Keeping
- // it in a separate routine allows good inlining of Unref into many profitable
- // call sites. However, the call to this function can be highly disruptive to
- // the register pressure in those callers. To minimize the cost to callers, we
- // use a special LLVM calling convention that preserves most registers. This
- // allows the call to this routine in cold paths to not disrupt the caller's
- // register pressure. This calling convention is not available on all
- // platforms; we intentionally allow LLVM to ignore the attribute rather than
- // attempting to hardcode the list of supported platforms.
-#if defined(__clang__) && !defined(__i386__)
-#if !(defined(ABSL_HAVE_MEMORY_SANITIZER) || \
- defined(ABSL_HAVE_THREAD_SANITIZER) || \
- defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
- defined(UNDEFINED_BEHAVIOR_SANITIZER))
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wattributes"
- __attribute__((preserve_most))
-#pragma clang diagnostic pop
-#endif // *_SANITIZER
-#endif
+ // Destroys the provided `rep`.
static void Destroy(CordRep* rep);
// Increments the reference count of `rep`.
@@ -383,6 +367,26 @@ class InlineData {
return as_tree_.cordz_info != kNullCordzInfo;
}
+ // Returns the cordz_info sampling instance for this instance, or nullptr
+ // if the current instance is not sampled and does not have CordzInfo data.
+ // Requires the current instance to hold a tree value.
+ CordzInfo* cordz_info() const {
+ assert(is_tree());
+ intptr_t info =
+ static_cast<intptr_t>(absl::big_endian::ToHost64(as_tree_.cordz_info));
+ assert(info & 1);
+ return reinterpret_cast<CordzInfo*>(info - 1);
+ }
+
+ // Sets the current cordz_info sampling instance for this instance, or nullptr
+ // if the current instance is not sampled and does not have CordzInfo data.
+ // Requires the current instance to hold a tree value.
+ void set_cordz_info(CordzInfo* cordz_info) {
+ assert(is_tree());
+ intptr_t info = reinterpret_cast<intptr_t>(cordz_info) | 1;
+ as_tree_.cordz_info = absl::big_endian::FromHost64(info);
+ }
+
// Returns a read only pointer to the character data inside this instance.
// Requires the current instance to hold inline data.
const char* as_chars() const {