Commit 8dc90ff0 by Vitaly Goldshteyn Committed by Copybara-Service

Extract `InsertPosition` function to be able to reuse it.

PiperOrigin-RevId: 612560213
Change-Id: Id75dfd1222a0bed8ec72ce21e4a97b1d09fc9eaa
parent 59daf188
...@@ -104,10 +104,11 @@ bool CommonFieldsGenerationInfoEnabled::should_rehash_for_bug_detection_on_move( ...@@ -104,10 +104,11 @@ bool CommonFieldsGenerationInfoEnabled::should_rehash_for_bug_detection_on_move(
return ShouldRehashForBugDetection(ctrl, capacity); return ShouldRehashForBugDetection(ctrl, capacity);
} }
bool ShouldInsertBackwards(size_t hash, const ctrl_t* ctrl) { bool ShouldInsertBackwardsForDebug(size_t capacity, size_t hash,
const ctrl_t* ctrl) {
// To avoid problems with weak hashes and single bit tests, we use % 13. // To avoid problems with weak hashes and single bit tests, we use % 13.
// TODO(kfm,sbenza): revisit after we do unconditional mixing // TODO(kfm,sbenza): revisit after we do unconditional mixing
return (H1(hash, ctrl) ^ RandomSeed()) % 13 > 6; return !is_small(capacity) && (H1(hash, ctrl) ^ RandomSeed()) % 13 > 6;
} }
void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity) { void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity) {
......
...@@ -546,7 +546,27 @@ inline bool IsEmptyGeneration(const GenerationType* generation) { ...@@ -546,7 +546,27 @@ inline bool IsEmptyGeneration(const GenerationType* generation) {
// Mixes a randomly generated per-process seed with `hash` and `ctrl` to // Mixes a randomly generated per-process seed with `hash` and `ctrl` to
// randomize insertion order within groups. // randomize insertion order within groups.
bool ShouldInsertBackwards(size_t hash, const ctrl_t* ctrl); bool ShouldInsertBackwardsForDebug(size_t capacity, size_t hash,
const ctrl_t* ctrl);
// Returns insert position for the given mask.
// We want to add entropy even when ASLR is not enabled.
// In debug build we will randomly insert in either the front or back of
// the group.
// TODO(kfm,sbenza): revisit after we do unconditional mixing
template <class Mask>
ABSL_ATTRIBUTE_ALWAYS_INLINE inline auto GetInsertionOffset(
Mask mask, ABSL_ATTRIBUTE_UNUSED size_t capacity,
ABSL_ATTRIBUTE_UNUSED size_t hash,
ABSL_ATTRIBUTE_UNUSED const ctrl_t* ctrl) {
#if defined(NDEBUG)
return mask.LowestBitSet();
#else
return ShouldInsertBackwardsForDebug(capacity, hash, ctrl)
? mask.HighestBitSet()
: mask.LowestBitSet();
#endif
}
// Returns a per-table, hash salt, which changes on resize. This gets mixed into // Returns a per-table, hash salt, which changes on resize. This gets mixed into
// H1 to randomize iteration order per-table. // H1 to randomize iteration order per-table.
...@@ -1495,16 +1515,9 @@ inline FindInfo find_first_non_full(const CommonFields& common, size_t hash) { ...@@ -1495,16 +1515,9 @@ inline FindInfo find_first_non_full(const CommonFields& common, size_t hash) {
GroupFullEmptyOrDeleted g{ctrl + seq.offset()}; GroupFullEmptyOrDeleted g{ctrl + seq.offset()};
auto mask = g.MaskEmptyOrDeleted(); auto mask = g.MaskEmptyOrDeleted();
if (mask) { if (mask) {
#if !defined(NDEBUG) return {
// We want to add entropy even when ASLR is not enabled. seq.offset(GetInsertionOffset(mask, common.capacity(), hash, ctrl)),
// In debug build we will randomly insert in either the front or back of seq.index()};
// the group.
// TODO(kfm,sbenza): revisit after we do unconditional mixing
if (!is_small(common.capacity()) && ShouldInsertBackwards(hash, ctrl)) {
return {seq.offset(mask.HighestBitSet()), seq.index()};
}
#endif
return {seq.offset(mask.LowestBitSet()), seq.index()};
} }
seq.next(); seq.next();
assert(seq.index() <= common.capacity() && "full table!"); assert(seq.index() <= common.capacity() && "full table!");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment