From b06e719ee985ecd63e0dffbc68499549216f817f Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 8 Jul 2021 15:41:34 -0700 Subject: Export of internal Abseil changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- 007ce045d5d38a727ededdb5bf06e64785fd73bd by Martijn Vels : Add `cord_enable_btree` feature flag (default false). PiperOrigin-RevId: 383729939 -- 98e7dc6a0407b0fd7b8713d883cdb3a766e0583d by Benjamin Barenblat : Eliminate some byte swapping from randen_slow Stop swapping bytes when serializing randen_slow’s Vector128 into and out of memory. Instead, simply index different bytes in the AES round function. This requires byte swapping the te{0..3} lookup tables, but it produces an 8% speedup on my Xeon W-2135. PiperOrigin-RevId: 383689402 -- 180b6bf45049188840d439b16a28e6b968669340 by Evan Brown : Minor simplification in drop_deletes_without_resize() - save probe_offset outside the lambda. Also, add some consts, avoid an auto, and use lambda capture by value instead of reference. I realized that the compiler can already optimize this - https://godbolt.org/z/Wxd9c4TfK, but I think this way makes the code a bit clearer. PiperOrigin-RevId: 383646658 -- 781706a974c4dc1c0abbb6b801fca0550229e883 by Martijn Vels : Change storage to contain 3 bytes. As per the comments in the code, this allows us to utilize all available space in CordRep that may otherwise be 'lost' in padding in derived clases. For the upcoming CordrepBtree class, we want a strong guarantee on having a 64 bytes aligned implementation. PiperOrigin-RevId: 383633963 -- 8fe22ecf92492fa6649938a2215934ebfe01c714 by Derek Mauro : Remove reference to str_format_arg.h, which no longer exists PiperOrigin-RevId: 383517865 -- 79397f3b18f18c1e2d7aea993b687329d626ce64 by Benjamin Barenblat : Use absl::uint128 for AES random number generator Replace randen’s internal 128-bit integer struct, u64x2, with absl::uint128. This eliminates some code and improves support for big-endian platforms. PiperOrigin-RevId: 383475671 GitOrigin-RevId: 007ce045d5d38a727ededdb5bf06e64785fd73bd Change-Id: Ia9d9c40de557221f1744fb0d6d4d6ca7ac569070 --- absl/strings/internal/cord_internal.cc | 1 + absl/strings/internal/cord_internal.h | 21 ++++++++++++++++++--- absl/strings/internal/cord_rep_flat.h | 4 ++-- 3 files changed, 21 insertions(+), 5 deletions(-) (limited to 'absl/strings/internal') diff --git a/absl/strings/internal/cord_internal.cc b/absl/strings/internal/cord_internal.cc index 905ffd0c..6a0b051c 100644 --- a/absl/strings/internal/cord_internal.cc +++ b/absl/strings/internal/cord_internal.cc @@ -25,6 +25,7 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace cord_internal { +ABSL_CONST_INIT std::atomic cord_btree_enabled(kCordEnableBtreeDefault); ABSL_CONST_INIT std::atomic cord_ring_buffer_enabled( kCordEnableRingBufferDefault); ABSL_CONST_INIT std::atomic shallow_subcords_enabled( diff --git a/absl/strings/internal/cord_internal.h b/absl/strings/internal/cord_internal.h index bddc9815..371a7f9c 100644 --- a/absl/strings/internal/cord_internal.h +++ b/absl/strings/internal/cord_internal.h @@ -37,13 +37,19 @@ class CordzInfo; // Default feature enable states for cord ring buffers enum CordFeatureDefaults { + kCordEnableBtreeDefault = false, kCordEnableRingBufferDefault = false, kCordShallowSubcordsDefault = false }; +extern std::atomic cord_btree_enabled; extern std::atomic cord_ring_buffer_enabled; extern std::atomic shallow_subcords_enabled; +inline void enable_cord_btree(bool enable) { + cord_btree_enabled.store(enable, std::memory_order_relaxed); +} + inline void enable_cord_ring_buffer(bool enable) { cord_ring_buffer_enabled.store(enable, std::memory_order_relaxed); } @@ -193,7 +199,16 @@ struct CordRep { // If tag < FLAT, it represents CordRepKind and indicates the type of node. // Otherwise, the node type is CordRepFlat and the tag is the encoded size. uint8_t tag; - char storage[1]; // Starting point for flat array: MUST BE LAST FIELD + + // `storage` provides two main purposes: + // - the starting point for FlatCordRep.Data() [flexible-array-member] + // - 3 bytes of additional storage for use by derived classes. + // The latter is used by CordrepConcat and CordRepBtree. CordRepConcat stores + // a 'depth' value in storage[0], and the (future) CordRepBtree class stores + // `height`, `begin` and `end` in the 3 entries. Otherwise we would need to + // allocate room for these in the derived class, as not all compilers reuse + // padding space from the base class (clang and gcc do, MSVC does not, etc) + uint8_t storage[3]; inline CordRepRing* ring(); inline const CordRepRing* ring() const; @@ -228,8 +243,8 @@ struct CordRepConcat : public CordRep { CordRep* left; CordRep* right; - uint8_t depth() const { return static_cast(storage[0]); } - void set_depth(uint8_t depth) { storage[0] = static_cast(depth); } + uint8_t depth() const { return storage[0]; } + void set_depth(uint8_t depth) { storage[0] = depth; } }; struct CordRepSubstring : public CordRep { diff --git a/absl/strings/internal/cord_rep_flat.h b/absl/strings/internal/cord_rep_flat.h index cddb282f..4d0f9886 100644 --- a/absl/strings/internal/cord_rep_flat.h +++ b/absl/strings/internal/cord_rep_flat.h @@ -118,8 +118,8 @@ struct CordRepFlat : public CordRep { } // Returns a pointer to the data inside this flat rep. - char* Data() { return storage; } - const char* Data() const { return storage; } + char* Data() { return reinterpret_cast(storage); } + const char* Data() const { return reinterpret_cast(storage); } // Returns the maximum capacity (payload size) of this instance. size_t Capacity() const { return TagToLength(tag); } -- cgit v1.2.3