-- 05a099a580753f8e96cee38572e94dcdc079361b by Abseil Team <absl-team@google.com>: Import of CCTZ from GitHub. PiperOrigin-RevId: 405966217 -- c6b81e9ebc183d8389f14ecd091c8bad08cfe0aa by Abseil Team <absl-team@google.com>: Add `inline_element_size` to hashtablez (so that we can compute the weighted load factors properly e.g., in b/187896534). PiperOrigin-RevId: 405917711 -- 3e3673de4e54e4142c54b09e1644dfa3de4bb296 by Abseil Team <absl-team@google.com>: align indent of code comment in mutex.h PiperOrigin-RevId: 405871997 -- 2248301a5b14f8d2be5b2e9088f3528a353ea491 by Derek Mauro <dmauro@google.com>: Internal change PiperOrigin-RevId: 405639236 -- bc7d3c56fdad3dde4b89324af142529f2afe5f1b by Abseil Team <absl-team@google.com>: Import of CCTZ from GitHub. PiperOrigin-RevId: 405508045 -- 66472387276ef02505d99195747be862768bb35b by Laramie Leavitt <lar@google.com>: Also use uint8_t golden values in randen_test.cc This makes randen_test, randen_slow_test, and randen_hwaes_test essentially identical, as is the intent. PiperOrigin-RevId: 405484423 GitOrigin-RevId: 05a099a580753f8e96cee38572e94dcdc079361b Change-Id: I3dd5b0cfdb98d6e1ab02266194ba67d15428c2f8pull/1050/head
parent
f70eadadd7
commit
cc413f8b67
17 changed files with 329 additions and 37 deletions
@ -0,0 +1,114 @@ |
||||
// Copyright 2018 The Abseil Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// https://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "gmock/gmock.h" |
||||
#include "gtest/gtest.h" |
||||
#include "absl/container/flat_hash_map.h" |
||||
#include "absl/container/flat_hash_set.h" |
||||
#include "absl/container/node_hash_map.h" |
||||
#include "absl/container/node_hash_set.h" |
||||
|
||||
namespace absl { |
||||
ABSL_NAMESPACE_BEGIN |
||||
namespace container_internal { |
||||
namespace { |
||||
|
||||
#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) |
||||
// Create some tables of type `Table`, then look at all the new
|
||||
// `HashtablezInfo`s to make sure that the `inline_element_size ==
|
||||
// expected_element_size`. The `inline_element_size` is the amount of memory
|
||||
// allocated for each slot of a hash table, that is `sizeof(slot_type)`. Add
|
||||
// the new `HashtablezInfo`s to `preexisting_info`. Store all the new tables
|
||||
// into `tables`.
|
||||
template <class Table> |
||||
void TestInlineElementSize( |
||||
HashtablezSampler& sampler, |
||||
// clang-tidy gives a false positive on this declaration. This unordered
|
||||
// set cannot be flat_hash_set, however, since that would introduce a mutex
|
||||
// deadlock.
|
||||
std::unordered_set<const HashtablezInfo*>& preexisting_info, // NOLINT
|
||||
std::vector<Table>& tables, const typename Table::value_type& elt, |
||||
size_t expected_element_size) { |
||||
for (int i = 0; i < 10; ++i) { |
||||
// We create a new table and must store it somewhere so that when we store
|
||||
// a pointer to the resulting `HashtablezInfo` into `preexisting_info`
|
||||
// that we aren't storing a dangling pointer.
|
||||
tables.emplace_back(); |
||||
// We must insert an element to get a hashtablez to instantiate.
|
||||
tables.back().insert(elt); |
||||
} |
||||
size_t new_count = 0; |
||||
sampler.Iterate([&](const HashtablezInfo& info) { |
||||
if (preexisting_info.insert(&info).second) { |
||||
EXPECT_EQ(info.inline_element_size, expected_element_size); |
||||
++new_count; |
||||
} |
||||
}); |
||||
// Make sure we actually did get a new hashtablez.
|
||||
EXPECT_GT(new_count, 0); |
||||
} |
||||
|
||||
struct bigstruct { |
||||
char a[1000]; |
||||
friend bool operator==(const bigstruct& x, const bigstruct& y) { |
||||
return memcmp(x.a, y.a, sizeof(x.a)) == 0; |
||||
} |
||||
template <typename H> |
||||
friend H AbslHashValue(H h, const bigstruct& c) { |
||||
return H::combine_contiguous(std::move(h), c.a, sizeof(c.a)); |
||||
} |
||||
}; |
||||
#endif |
||||
|
||||
TEST(FlatHashMap, SampleElementSize) { |
||||
#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) |
||||
// Enable sampling even if the prod default is off.
|
||||
SetHashtablezEnabled(true); |
||||
SetHashtablezSampleParameter(1); |
||||
|
||||
auto& sampler = GlobalHashtablezSampler(); |
||||
std::vector<flat_hash_map<int, bigstruct>> flat_map_tables; |
||||
std::vector<flat_hash_set<bigstruct>> flat_set_tables; |
||||
std::vector<node_hash_map<int, bigstruct>> node_map_tables; |
||||
std::vector<node_hash_set<bigstruct>> node_set_tables; |
||||
|
||||
// It takes thousands of new tables after changing the sampling parameters
|
||||
// before you actually get some instrumentation. And if you must actually
|
||||
// put something into those tables.
|
||||
for (int i = 0; i < 10000; ++i) { |
||||
flat_map_tables.emplace_back(); |
||||
flat_map_tables.back()[i] = bigstruct{}; |
||||
} |
||||
|
||||
// clang-tidy gives a false positive on this declaration. This unordered set
|
||||
// cannot be a flat_hash_set, however, since that would introduce a mutex
|
||||
// deadlock.
|
||||
std::unordered_set<const HashtablezInfo*> preexisting_info; // NOLINT
|
||||
sampler.Iterate( |
||||
[&](const HashtablezInfo& info) { preexisting_info.insert(&info); }); |
||||
TestInlineElementSize(sampler, preexisting_info, flat_map_tables, |
||||
{0, bigstruct{}}, sizeof(int) + sizeof(bigstruct)); |
||||
TestInlineElementSize(sampler, preexisting_info, node_map_tables, |
||||
{0, bigstruct{}}, sizeof(void*)); |
||||
TestInlineElementSize(sampler, preexisting_info, flat_set_tables, //
|
||||
bigstruct{}, sizeof(bigstruct)); |
||||
TestInlineElementSize(sampler, preexisting_info, node_set_tables, //
|
||||
bigstruct{}, sizeof(void*)); |
||||
#endif |
||||
} |
||||
|
||||
} // namespace
|
||||
} // namespace container_internal
|
||||
ABSL_NAMESPACE_END |
||||
} // namespace absl
|
@ -1 +1 @@ |
||||
2021c |
||||
2021e |
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue